diff options
Diffstat (limited to 'drivers/uwb')
| -rw-r--r-- | drivers/uwb/Kconfig | 3 | ||||
| -rw-r--r-- | drivers/uwb/allocator.c | 6 | ||||
| -rw-r--r-- | drivers/uwb/beacon.c | 16 | ||||
| -rw-r--r-- | drivers/uwb/driver.c | 2 | ||||
| -rw-r--r-- | drivers/uwb/drp-ie.c | 4 | ||||
| -rw-r--r-- | drivers/uwb/drp.c | 314 | ||||
| -rw-r--r-- | drivers/uwb/est.c | 12 | ||||
| -rw-r--r-- | drivers/uwb/hwa-rc.c | 37 | ||||
| -rw-r--r-- | drivers/uwb/i1480/dfu/dfu.c | 1 | ||||
| -rw-r--r-- | drivers/uwb/i1480/dfu/usb.c | 22 | ||||
| -rw-r--r-- | drivers/uwb/i1480/i1480-est.c | 2 | ||||
| -rw-r--r-- | drivers/uwb/ie-rcv.c | 2 | ||||
| -rw-r--r-- | drivers/uwb/ie.c | 1 | ||||
| -rw-r--r-- | drivers/uwb/lc-dev.c | 20 | ||||
| -rw-r--r-- | drivers/uwb/lc-rc.c | 24 | ||||
| -rw-r--r-- | drivers/uwb/neh.c | 13 | ||||
| -rw-r--r-- | drivers/uwb/pal.c | 43 | ||||
| -rw-r--r-- | drivers/uwb/radio.c | 9 | ||||
| -rw-r--r-- | drivers/uwb/reset.c | 4 | ||||
| -rw-r--r-- | drivers/uwb/rsv.c | 46 | ||||
| -rw-r--r-- | drivers/uwb/scan.c | 3 | ||||
| -rw-r--r-- | drivers/uwb/umc-bus.c | 18 | ||||
| -rw-r--r-- | drivers/uwb/umc-dev.c | 11 | ||||
| -rw-r--r-- | drivers/uwb/umc-drv.c | 1 | ||||
| -rw-r--r-- | drivers/uwb/uwb-debug.c | 9 | ||||
| -rw-r--r-- | drivers/uwb/uwb-internal.h | 4 | ||||
| -rw-r--r-- | drivers/uwb/uwbd.c | 2 | ||||
| -rw-r--r-- | drivers/uwb/whc-rc.c | 4 | ||||
| -rw-r--r-- | drivers/uwb/whci.c | 15 | 
29 files changed, 365 insertions, 283 deletions
diff --git a/drivers/uwb/Kconfig b/drivers/uwb/Kconfig index d100f54ed65..2431eedbe6a 100644 --- a/drivers/uwb/Kconfig +++ b/drivers/uwb/Kconfig @@ -3,8 +3,7 @@  #  menuconfig UWB -	tristate "Ultra Wideband devices (EXPERIMENTAL)" -	depends on EXPERIMENTAL +	tristate "Ultra Wideband devices"  	depends on PCI  	default n  	help diff --git a/drivers/uwb/allocator.c b/drivers/uwb/allocator.c index e45e673b877..6e3e713f0ef 100644 --- a/drivers/uwb/allocator.c +++ b/drivers/uwb/allocator.c @@ -334,10 +334,8 @@ int uwb_rsv_find_best_allocation(struct uwb_rsv *rsv, struct uwb_mas_bm *availab  	/* fill the not available vector from the available bm */ -	for (bit_index = 0; bit_index < UWB_NUM_MAS; bit_index++) { -		if (!test_bit(bit_index, available->bm)) -			ai->bm[bit_index] = UWB_RSV_MAS_NOT_AVAIL; -	} +	for_each_clear_bit(bit_index, available->bm, UWB_NUM_MAS) +		ai->bm[bit_index] = UWB_RSV_MAS_NOT_AVAIL;  	if (ai->max_interval == 1) {  		get_row_descriptors(ai); diff --git a/drivers/uwb/beacon.c b/drivers/uwb/beacon.c index dcdd59bfcd0..f40745fcbd3 100644 --- a/drivers/uwb/beacon.c +++ b/drivers/uwb/beacon.c @@ -117,6 +117,7 @@ int uwb_rc_beacon(struct uwb_rc *rc, int channel, unsigned bpst_offset)  	int result;  	struct device *dev = &rc->uwb_dev.dev; +	dev_dbg(dev, "%s: channel = %d\n", __func__, channel);  	if (channel < 0)  		channel = -1;  	if (channel == -1) @@ -124,8 +125,10 @@ int uwb_rc_beacon(struct uwb_rc *rc, int channel, unsigned bpst_offset)  	else {  		/* channel >= 0...dah */  		result = uwb_rc_start_beacon(rc, bpst_offset, channel); -		if (result < 0) +		if (result < 0) { +			dev_err(dev, "Cannot start beaconing: %d\n", result);  			return result; +		}  		if (le16_to_cpu(rc->ies->wIELength) > 0) {  			result = uwb_rc_set_ie(rc, rc->ies);  			if (result < 0) { @@ -184,7 +187,7 @@ out:  /* Find a beacon by dev addr in the cache */  static -struct uwb_beca_e *__uwb_beca_find_bymac(struct uwb_rc *rc,  +struct uwb_beca_e *__uwb_beca_find_bymac(struct uwb_rc *rc,  					 const struct uwb_mac_addr *mac_addr)  {  	struct uwb_beca_e *bce, *next; @@ -394,7 +397,6 @@ int uwbd_evt_handle_rc_beacon(struct uwb_event *evt)  	struct uwb_rc_evt_beacon *be;  	struct uwb_beacon_frame *bf;  	struct uwb_beca_e *bce; -	unsigned long last_ts;  	rc = evt->rc;  	be = container_of(evt->notif.rceb, struct uwb_rc_evt_beacon, rceb); @@ -438,8 +440,6 @@ int uwbd_evt_handle_rc_beacon(struct uwb_event *evt)  	/* purge old beacon data */  	kfree(bce->be); -	last_ts = bce->ts_jiffies; -  	/* Update commonly used fields */  	bce->ts_jiffies = evt->ts_jiffies;  	bce->be = be; @@ -515,13 +515,13 @@ int uwbd_evt_handle_rc_bp_slot_change(struct uwb_event *evt)  	}  	bpsc = container_of(evt->notif.rceb, struct uwb_rc_evt_bp_slot_change, rceb); -	mutex_lock(&rc->uwb_dev.mutex);  	if (uwb_rc_evt_bp_slot_change_no_slot(bpsc)) { -		dev_info(dev, "stopped beaconing: No free slots in BP\n"); +		dev_err(dev, "stopped beaconing: No free slots in BP\n"); +		mutex_lock(&rc->uwb_dev.mutex);  		rc->beaconing = -1; +		mutex_unlock(&rc->uwb_dev.mutex);  	} else  		rc->uwb_dev.beacon_slot = uwb_rc_evt_bp_slot_change_slot_num(bpsc); -	mutex_unlock(&rc->uwb_dev.mutex);  	return 0;  } diff --git a/drivers/uwb/driver.c b/drivers/uwb/driver.c index 08bd6dbfd4a..3e5454aba5d 100644 --- a/drivers/uwb/driver.c +++ b/drivers/uwb/driver.c @@ -61,7 +61,7 @@  /** - * If a beacon dissapears for longer than this, then we consider the + * If a beacon disappears for longer than this, then we consider the   * device who was represented by that beacon to be gone.   *   * ECMA-368[17.2.3, last para] establishes that a device must not diff --git a/drivers/uwb/drp-ie.c b/drivers/uwb/drp-ie.c index 520673109a7..b7d4f6b75ee 100644 --- a/drivers/uwb/drp-ie.c +++ b/drivers/uwb/drp-ie.c @@ -27,7 +27,7 @@  /*   * Return the reason code for a reservations's DRP IE.   */ -int uwb_rsv_reason_code(struct uwb_rsv *rsv) +static int uwb_rsv_reason_code(struct uwb_rsv *rsv)  {  	static const int reason_codes[] = {  		[UWB_RSV_STATE_O_INITIATED]          = UWB_DRP_REASON_ACCEPTED, @@ -55,7 +55,7 @@ int uwb_rsv_reason_code(struct uwb_rsv *rsv)  /*   * Return the reason code for a reservations's companion DRP IE .   */ -int uwb_rsv_companion_reason_code(struct uwb_rsv *rsv) +static int uwb_rsv_companion_reason_code(struct uwb_rsv *rsv)  {  	static const int companion_reason_codes[] = {  		[UWB_RSV_STATE_O_MOVE_EXPANDING]     = UWB_DRP_REASON_ACCEPTED, diff --git a/drivers/uwb/drp.c b/drivers/uwb/drp.c index a8d83e25e3b..05b7bd76225 100644 --- a/drivers/uwb/drp.c +++ b/drivers/uwb/drp.c @@ -27,21 +27,21 @@  /* DRP Conflict Actions ([ECMA-368 2nd Edition] 17.4.6) */  enum uwb_drp_conflict_action { -	/* Reservation is mantained, no action needed */ +	/* Reservation is maintained, no action needed */  	UWB_DRP_CONFLICT_MANTAIN = 0, -	 +  	/* the device shall not transmit frames in conflicting MASs in  	 * the following superframe. If the device is the reservation  	 * target, it shall also set the Reason Code in its DRP IE to  	 * Conflict in its beacon in the following superframe.  	 */  	UWB_DRP_CONFLICT_ACT1, -	 +  	/* the device shall not set the Reservation Status bit to ONE  	 * and shall not transmit frames in conflicting MASs. If the  	 * device is the reservation target, it shall also set the  	 * Reason Code in its DRP IE to Conflict. -	 */	 +	 */  	UWB_DRP_CONFLICT_ACT2,  	/* the device shall not transmit frames in conflicting MASs in @@ -59,6 +59,7 @@ static void uwb_rc_set_drp_cmd_done(struct uwb_rc *rc, void *arg,  				    struct uwb_rceb *reply, ssize_t reply_size)  {  	struct uwb_rc_evt_set_drp_ie *r = (struct uwb_rc_evt_set_drp_ie *)reply; +	unsigned long flags;  	if (r != NULL) {  		if (r->bResultCode != UWB_RC_RES_SUCCESS) @@ -67,14 +68,14 @@ static void uwb_rc_set_drp_cmd_done(struct uwb_rc *rc, void *arg,  	} else  		dev_err(&rc->uwb_dev.dev, "SET-DRP-IE: timeout\n"); -	spin_lock_bh(&rc->rsvs_lock); +	spin_lock_irqsave(&rc->rsvs_lock, flags);  	if (rc->set_drp_ie_pending > 1) {  		rc->set_drp_ie_pending = 0; -		uwb_rsv_queue_update(rc);	 +		uwb_rsv_queue_update(rc);  	} else { -		rc->set_drp_ie_pending = 0;	 +		rc->set_drp_ie_pending = 0;  	} -	spin_unlock_bh(&rc->rsvs_lock); +	spin_unlock_irqrestore(&rc->rsvs_lock, flags);  }  /** @@ -114,7 +115,8 @@ int uwb_rc_send_all_drp_ie(struct uwb_rc *rc)  			if (uwb_rsv_has_two_drp_ies(rsv) &&  				(rsv->mv.companion_drp_ie != NULL)) {  				mv = &rsv->mv; -				num_bytes += mv->companion_drp_ie->hdr.length + 2;	 +				num_bytes += +					mv->companion_drp_ie->hdr.length + 2;  			}  		}  	} @@ -138,21 +140,23 @@ int uwb_rc_send_all_drp_ie(struct uwb_rc *rc)  			memcpy(IEDataptr, rsv->drp_ie,  			       rsv->drp_ie->hdr.length + 2);  			IEDataptr += rsv->drp_ie->hdr.length + 2; -			 +  			if (uwb_rsv_has_two_drp_ies(rsv) &&  				(rsv->mv.companion_drp_ie != NULL)) {  				mv = &rsv->mv;  				memcpy(IEDataptr, mv->companion_drp_ie,  				       mv->companion_drp_ie->hdr.length + 2); -				IEDataptr += mv->companion_drp_ie->hdr.length + 2;	 +				IEDataptr += +					mv->companion_drp_ie->hdr.length + 2;  			}  		}  	} -	result = uwb_rc_cmd_async(rc, "SET-DRP-IE", &cmd->rccb, sizeof(*cmd) + num_bytes, -				  UWB_RC_CET_GENERAL, UWB_RC_CMD_SET_DRP_IE, -				  uwb_rc_set_drp_cmd_done, NULL); -	 +	result = uwb_rc_cmd_async(rc, "SET-DRP-IE", +				&cmd->rccb, sizeof(*cmd) + num_bytes, +				UWB_RC_CET_GENERAL, UWB_RC_CMD_SET_DRP_IE, +				uwb_rc_set_drp_cmd_done, NULL); +  	rc->set_drp_ie_pending = 1;  	kfree(cmd); @@ -175,8 +179,8 @@ static int evaluate_conflict_action(struct uwb_ie_drp *ext_drp_ie, int ext_beaco  	int ext_tie_breaker = uwb_ie_drp_tiebreaker(ext_drp_ie);  	int ext_status      = uwb_ie_drp_status(ext_drp_ie);  	int ext_type        = uwb_ie_drp_type(ext_drp_ie); -	 -	 + +  	/* [ECMA-368 2nd Edition] 17.4.6 */  	if (ext_type == UWB_DRP_TYPE_PCA && our_type == UWB_DRP_TYPE_PCA) {  		return UWB_DRP_CONFLICT_MANTAIN; @@ -186,7 +190,7 @@ static int evaluate_conflict_action(struct uwb_ie_drp *ext_drp_ie, int ext_beaco  	if (our_type == UWB_DRP_TYPE_ALIEN_BP) {  		return UWB_DRP_CONFLICT_MANTAIN;  	} -	 +  	/* [ECMA-368 2nd Edition] 17.4.6-2 */  	if (ext_type == UWB_DRP_TYPE_ALIEN_BP) {  		/* here we know our_type != UWB_DRP_TYPE_ALIEN_BP */ @@ -214,7 +218,7 @@ static int evaluate_conflict_action(struct uwb_ie_drp *ext_drp_ie, int ext_beaco  	    our_beacon_slot >  ext_beacon_slot) {  		return UWB_DRP_CONFLICT_MANTAIN;  	} -	 +  	if (our_status == 0) {  		if (our_tie_breaker == ext_tie_breaker) {  			/* [ECMA-368 2nd Edition] 17.4.6-6a */ @@ -243,9 +247,9 @@ static int evaluate_conflict_action(struct uwb_ie_drp *ext_drp_ie, int ext_beaco  	return UWB_DRP_CONFLICT_MANTAIN;  } -static void handle_conflict_normal(struct uwb_ie_drp *drp_ie,  -				   int ext_beacon_slot,  -				   struct uwb_rsv *rsv,  +static void handle_conflict_normal(struct uwb_ie_drp *drp_ie, +				   int ext_beacon_slot, +				   struct uwb_rsv *rsv,  				   struct uwb_mas_bm *conflicting_mas)  {  	struct uwb_rc *rc = rsv->rc; @@ -262,7 +266,7 @@ static void handle_conflict_normal(struct uwb_ie_drp *drp_ie,  			uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_TO_BE_MOVED);  			if (bow->can_reserve_extra_mases == false)  				uwb_rsv_backoff_win_increment(rc); -			 +  			break;  		case UWB_DRP_CONFLICT_ACT3:  			uwb_rsv_backoff_win_increment(rc); @@ -277,13 +281,13 @@ static void handle_conflict_normal(struct uwb_ie_drp *drp_ie,  		switch(action) {  		case UWB_DRP_CONFLICT_ACT2:  		case UWB_DRP_CONFLICT_ACT3: -			uwb_rsv_set_state(rsv, UWB_RSV_STATE_T_CONFLICT);	 +			uwb_rsv_set_state(rsv, UWB_RSV_STATE_T_CONFLICT);  		default:  			break;  		}  	} -	 +  }  static void handle_conflict_expanding(struct uwb_ie_drp *drp_ie, int ext_beacon_slot, @@ -294,7 +298,7 @@ static void handle_conflict_expanding(struct uwb_ie_drp *drp_ie, int ext_beacon_  	struct uwb_drp_backoff_win *bow = &rc->bow;  	struct uwb_rsv_move *mv = &rsv->mv;  	int action; -	 +  	if (companion_only) {  		/* status of companion is 0 at this point */  		action = evaluate_conflict_action(drp_ie, ext_beacon_slot, rsv, 0); @@ -302,21 +306,24 @@ static void handle_conflict_expanding(struct uwb_ie_drp *drp_ie, int ext_beacon_  			switch(action) {  			case UWB_DRP_CONFLICT_ACT2:  			case UWB_DRP_CONFLICT_ACT3: -				uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_ESTABLISHED); +				uwb_rsv_set_state(rsv, +						UWB_RSV_STATE_O_ESTABLISHED);  				rsv->needs_release_companion_mas = false;  				if (bow->can_reserve_extra_mases == false)  					uwb_rsv_backoff_win_increment(rc); -				uwb_drp_avail_release(rsv->rc, &rsv->mv.companion_mas); +				uwb_drp_avail_release(rsv->rc, +						&rsv->mv.companion_mas);  			} -		} else { /* rsv is target */			 +		} else { /* rsv is target */  			switch(action) {  			case UWB_DRP_CONFLICT_ACT2:  			case UWB_DRP_CONFLICT_ACT3: -				uwb_rsv_set_state(rsv, UWB_RSV_STATE_T_EXPANDING_CONFLICT); +				uwb_rsv_set_state(rsv, +					UWB_RSV_STATE_T_EXPANDING_CONFLICT);                                  /* send_drp_avail_ie = true; */  			}  		} -	} else { /* also base part of the reservation is conflicting */		 +	} else { /* also base part of the reservation is conflicting */  		if (uwb_rsv_is_owner(rsv)) {  			uwb_rsv_backoff_win_increment(rc);  			/* remove companion part */ @@ -325,7 +332,8 @@ static void handle_conflict_expanding(struct uwb_ie_drp *drp_ie, int ext_beacon_  			/* drop some mases with reason modified */  			/* put in the companion the mases to be dropped */ -			bitmap_andnot(mv->companion_mas.bm, rsv->mas.bm, conflicting_mas->bm, UWB_NUM_MAS); +			bitmap_andnot(mv->companion_mas.bm, rsv->mas.bm, +					conflicting_mas->bm, UWB_NUM_MAS);  			uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_MODIFIED);  		} else { /* it is a target rsv */  			uwb_rsv_set_state(rsv, UWB_RSV_STATE_T_CONFLICT); @@ -335,7 +343,7 @@ static void handle_conflict_expanding(struct uwb_ie_drp *drp_ie, int ext_beacon_  }  static void uwb_drp_handle_conflict_rsv(struct uwb_rc *rc, struct uwb_rsv *rsv, -					struct uwb_rc_evt_drp *drp_evt,  +					struct uwb_rc_evt_drp *drp_evt,  					struct uwb_ie_drp *drp_ie,  					struct uwb_mas_bm *conflicting_mas)  { @@ -344,83 +352,107 @@ static void uwb_drp_handle_conflict_rsv(struct uwb_rc *rc, struct uwb_rsv *rsv,  	/* check if the conflicting reservation has two drp_ies */  	if (uwb_rsv_has_two_drp_ies(rsv)) {  		mv = &rsv->mv; -		if (bitmap_intersects(rsv->mas.bm, conflicting_mas->bm, UWB_NUM_MAS)) { -			handle_conflict_expanding(drp_ie, drp_evt->beacon_slot_number, -						  rsv, false, conflicting_mas); +		if (bitmap_intersects(rsv->mas.bm, conflicting_mas->bm, +								UWB_NUM_MAS)) { +			handle_conflict_expanding(drp_ie, +						drp_evt->beacon_slot_number, +						rsv, false, conflicting_mas);  		} else { -			if (bitmap_intersects(mv->companion_mas.bm, conflicting_mas->bm, UWB_NUM_MAS)) { -				handle_conflict_expanding(drp_ie, drp_evt->beacon_slot_number, -							  rsv, true, conflicting_mas);	 +			if (bitmap_intersects(mv->companion_mas.bm, +					conflicting_mas->bm, UWB_NUM_MAS)) { +				handle_conflict_expanding( +					drp_ie, drp_evt->beacon_slot_number, +					rsv, true, conflicting_mas);  			}  		} -	} else if (bitmap_intersects(rsv->mas.bm, conflicting_mas->bm, UWB_NUM_MAS)) { -		handle_conflict_normal(drp_ie, drp_evt->beacon_slot_number, rsv, conflicting_mas); +	} else if (bitmap_intersects(rsv->mas.bm, conflicting_mas->bm, +							UWB_NUM_MAS)) { +		handle_conflict_normal(drp_ie, drp_evt->beacon_slot_number, +					rsv, conflicting_mas);  	}  }  static void uwb_drp_handle_all_conflict_rsv(struct uwb_rc *rc, -					    struct uwb_rc_evt_drp *drp_evt,  +					    struct uwb_rc_evt_drp *drp_evt,  					    struct uwb_ie_drp *drp_ie,  					    struct uwb_mas_bm *conflicting_mas)  {  	struct uwb_rsv *rsv; -	 +  	list_for_each_entry(rsv, &rc->reservations, rc_node) { -		uwb_drp_handle_conflict_rsv(rc, rsv, drp_evt, drp_ie, conflicting_mas);	 +		uwb_drp_handle_conflict_rsv(rc, rsv, drp_evt, drp_ie, +							conflicting_mas); +	} +} + +static void uwb_drp_process_target_accepted(struct uwb_rc *rc, +	struct uwb_rsv *rsv, struct uwb_rc_evt_drp *drp_evt, +	struct uwb_ie_drp *drp_ie, struct uwb_mas_bm *mas) +{ +	struct uwb_rsv_move *mv = &rsv->mv; +	int status; + +	status = uwb_ie_drp_status(drp_ie); + +	if (rsv->state == UWB_RSV_STATE_T_CONFLICT) { +		uwb_rsv_set_state(rsv, UWB_RSV_STATE_T_CONFLICT); +		return; +	} + +	if (rsv->state == UWB_RSV_STATE_T_EXPANDING_ACCEPTED) { +		/* drp_ie is companion */ +		if (!bitmap_equal(rsv->mas.bm, mas->bm, UWB_NUM_MAS)) { +			/* stroke companion */ +			uwb_rsv_set_state(rsv, +				UWB_RSV_STATE_T_EXPANDING_ACCEPTED); +		} +	} else { +		if (!bitmap_equal(rsv->mas.bm, mas->bm, UWB_NUM_MAS)) { +			if (uwb_drp_avail_reserve_pending(rc, mas) == -EBUSY) { +				/* FIXME: there is a conflict, find +				 * the conflicting reservations and +				 * take a sensible action. Consider +				 * that in drp_ie there is the +				 * "neighbour" */ +				uwb_drp_handle_all_conflict_rsv(rc, drp_evt, +						drp_ie, mas); +			} else { +				/* accept the extra reservation */ +				bitmap_copy(mv->companion_mas.bm, mas->bm, +								UWB_NUM_MAS); +				uwb_rsv_set_state(rsv, +					UWB_RSV_STATE_T_EXPANDING_ACCEPTED); +			} +		} else { +			if (status) { +				uwb_rsv_set_state(rsv, +						UWB_RSV_STATE_T_ACCEPTED); +			} +		} +  	}  } -	 +  /*   * Based on the DRP IE, transition a target reservation to a new   * state.   */  static void uwb_drp_process_target(struct uwb_rc *rc, struct uwb_rsv *rsv, -				   struct uwb_ie_drp *drp_ie, struct uwb_rc_evt_drp *drp_evt) +		   struct uwb_ie_drp *drp_ie, struct uwb_rc_evt_drp *drp_evt)  {  	struct device *dev = &rc->uwb_dev.dev;  	struct uwb_rsv_move *mv = &rsv->mv;  	int status;  	enum uwb_drp_reason reason_code;  	struct uwb_mas_bm mas; -	 +  	status = uwb_ie_drp_status(drp_ie);  	reason_code = uwb_ie_drp_reason_code(drp_ie);  	uwb_drp_ie_to_bm(&mas, drp_ie);  	switch (reason_code) {  	case UWB_DRP_REASON_ACCEPTED: - -		if (rsv->state == UWB_RSV_STATE_T_CONFLICT) { -			uwb_rsv_set_state(rsv, UWB_RSV_STATE_T_CONFLICT); -			break; -		} - -		if (rsv->state == UWB_RSV_STATE_T_EXPANDING_ACCEPTED) { -			/* drp_ie is companion */ -			if (!bitmap_equal(rsv->mas.bm, mas.bm, UWB_NUM_MAS)) -				/* stroke companion */ -				uwb_rsv_set_state(rsv, UWB_RSV_STATE_T_EXPANDING_ACCEPTED);	 -		} else { -			if (!bitmap_equal(rsv->mas.bm, mas.bm, UWB_NUM_MAS)) { -				if (uwb_drp_avail_reserve_pending(rc, &mas) == -EBUSY) { -					/* FIXME: there is a conflict, find -					 * the conflicting reservations and -					 * take a sensible action. Consider -					 * that in drp_ie there is the -					 * "neighbour" */ -					uwb_drp_handle_all_conflict_rsv(rc, drp_evt, drp_ie, &mas); -				} else { -					/* accept the extra reservation */ -					bitmap_copy(mv->companion_mas.bm, mas.bm, UWB_NUM_MAS); -					uwb_rsv_set_state(rsv, UWB_RSV_STATE_T_EXPANDING_ACCEPTED); -				} -			} else { -				if (status) { -					uwb_rsv_set_state(rsv, UWB_RSV_STATE_T_ACCEPTED); -				} -			} -			 -		} +		uwb_drp_process_target_accepted(rc, rsv, drp_evt, drp_ie, &mas);  		break;  	case UWB_DRP_REASON_MODIFIED: @@ -433,7 +465,8 @@ static void uwb_drp_process_target(struct uwb_rc *rc, struct uwb_rsv *rsv,  		/* find if the owner wants to expand or reduce */  		if (bitmap_subset(mas.bm, rsv->mas.bm, UWB_NUM_MAS)) {  			/* owner is reducing */ -			bitmap_andnot(mv->companion_mas.bm, rsv->mas.bm, mas.bm, UWB_NUM_MAS); +			bitmap_andnot(mv->companion_mas.bm, rsv->mas.bm, mas.bm, +				UWB_NUM_MAS);  			uwb_drp_avail_release(rsv->rc, &mv->companion_mas);  		} @@ -446,6 +479,48 @@ static void uwb_drp_process_target(struct uwb_rc *rc, struct uwb_rsv *rsv,  	}  } +static void uwb_drp_process_owner_accepted(struct uwb_rsv *rsv, +						struct uwb_mas_bm *mas) +{ +	struct uwb_rsv_move *mv = &rsv->mv; + +	switch (rsv->state) { +	case UWB_RSV_STATE_O_PENDING: +	case UWB_RSV_STATE_O_INITIATED: +	case UWB_RSV_STATE_O_ESTABLISHED: +		uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_ESTABLISHED); +		break; +	case UWB_RSV_STATE_O_MODIFIED: +		if (bitmap_equal(mas->bm, rsv->mas.bm, UWB_NUM_MAS)) +			uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_ESTABLISHED); +		else +			uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_MODIFIED); +		break; + +	case UWB_RSV_STATE_O_MOVE_REDUCING: /* shouldn' t be a problem */ +		if (bitmap_equal(mas->bm, rsv->mas.bm, UWB_NUM_MAS)) +			uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_ESTABLISHED); +		else +			uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_MOVE_REDUCING); +		break; +	case UWB_RSV_STATE_O_MOVE_EXPANDING: +		if (bitmap_equal(mas->bm, mv->companion_mas.bm, UWB_NUM_MAS)) { +			/* Companion reservation accepted */ +			uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_MOVE_COMBINING); +		} else { +			uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_MOVE_EXPANDING); +		} +		break; +	case UWB_RSV_STATE_O_MOVE_COMBINING: +		if (bitmap_equal(mas->bm, rsv->mas.bm, UWB_NUM_MAS)) +			uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_MOVE_REDUCING); +		else +			uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_MOVE_COMBINING); +		break; +	default: +		break; +	} +}  /*   * Based on the DRP IE, transition an owner reservation to a new   * state. @@ -455,7 +530,6 @@ static void uwb_drp_process_owner(struct uwb_rc *rc, struct uwb_rsv *rsv,  				  struct uwb_rc_evt_drp *drp_evt)  {  	struct device *dev = &rc->uwb_dev.dev; -	struct uwb_rsv_move *mv = &rsv->mv;  	int status;  	enum uwb_drp_reason reason_code;  	struct uwb_mas_bm mas; @@ -467,44 +541,7 @@ static void uwb_drp_process_owner(struct uwb_rc *rc, struct uwb_rsv *rsv,  	if (status) {  		switch (reason_code) {  		case UWB_DRP_REASON_ACCEPTED: -			switch (rsv->state) { -			case UWB_RSV_STATE_O_PENDING: -			case UWB_RSV_STATE_O_INITIATED: -			case UWB_RSV_STATE_O_ESTABLISHED: -				uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_ESTABLISHED); -				break; -			case UWB_RSV_STATE_O_MODIFIED: -				if (bitmap_equal(mas.bm, rsv->mas.bm, UWB_NUM_MAS)) { -					uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_ESTABLISHED); -				} else { -					uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_MODIFIED);	 -				} -				break; -				 -			case UWB_RSV_STATE_O_MOVE_REDUCING: /* shouldn' t be a problem */ -				if (bitmap_equal(mas.bm, rsv->mas.bm, UWB_NUM_MAS)) { -					uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_ESTABLISHED); -				} else { -					uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_MOVE_REDUCING);	 -				} -				break; -			case UWB_RSV_STATE_O_MOVE_EXPANDING: -				if (bitmap_equal(mas.bm, mv->companion_mas.bm, UWB_NUM_MAS)) { -					/* Companion reservation accepted */ -					uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_MOVE_COMBINING); -				} else { -					uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_MOVE_EXPANDING); -				} -				break; -			case UWB_RSV_STATE_O_MOVE_COMBINING: -				if (bitmap_equal(mas.bm, rsv->mas.bm, UWB_NUM_MAS)) -					uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_MOVE_REDUCING); -				else -					uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_MOVE_COMBINING); -				break; -			default: -				break;	 -			} +			uwb_drp_process_owner_accepted(rsv, &mas);  			break;  		default:  			dev_warn(dev, "ignoring invalid DRP IE state (%d/%d)\n", @@ -544,9 +581,9 @@ static void uwb_cnflt_update_work(struct work_struct *work)  						     cnflt_update_work);  	struct uwb_cnflt_alien *c;  	struct uwb_rc *rc = cnflt->rc; -	 +  	unsigned long delay_us = UWB_MAS_LENGTH_US * UWB_MAS_PER_ZONE; -	 +  	mutex_lock(&rc->rsvs_mutex);  	list_del(&cnflt->rc_node); @@ -555,10 +592,12 @@ static void uwb_cnflt_update_work(struct work_struct *work)  	bitmap_zero(rc->cnflt_alien_bitmap.bm, UWB_NUM_MAS);  	list_for_each_entry(c, &rc->cnflt_alien_list, rc_node) { -		bitmap_or(rc->cnflt_alien_bitmap.bm, rc->cnflt_alien_bitmap.bm, c->mas.bm, UWB_NUM_MAS);			 +		bitmap_or(rc->cnflt_alien_bitmap.bm, rc->cnflt_alien_bitmap.bm, +						c->mas.bm, UWB_NUM_MAS);  	} -	 -	queue_delayed_work(rc->rsv_workq, &rc->rsv_alien_bp_work, usecs_to_jiffies(delay_us)); + +	queue_delayed_work(rc->rsv_workq, &rc->rsv_alien_bp_work, +					usecs_to_jiffies(delay_us));  	kfree(cnflt);  	mutex_unlock(&rc->rsvs_mutex); @@ -582,10 +621,10 @@ static void uwb_drp_handle_alien_drp(struct uwb_rc *rc, struct uwb_ie_drp *drp_i  	struct uwb_cnflt_alien *cnflt;  	char buf[72];  	unsigned long delay_us = UWB_MAS_LENGTH_US * UWB_MAS_PER_ZONE; -	 +  	uwb_drp_ie_to_bm(&mas, drp_ie);  	bitmap_scnprintf(buf, sizeof(buf), mas.bm, UWB_NUM_MAS); -	 +  	list_for_each_entry(cnflt, &rc->cnflt_alien_list, rc_node) {  		if (bitmap_equal(cnflt->mas.bm, mas.bm, UWB_NUM_MAS)) {  			/* Existing alien BP reservation conflicting @@ -599,8 +638,11 @@ static void uwb_drp_handle_alien_drp(struct uwb_rc *rc, struct uwb_ie_drp *drp_i  	/* alloc and initialize new uwb_cnflt_alien */  	cnflt = kzalloc(sizeof(struct uwb_cnflt_alien), GFP_KERNEL); -	if (!cnflt) +	if (!cnflt) {  		dev_err(dev, "failed to alloc uwb_cnflt_alien struct\n"); +		return; +	} +  	INIT_LIST_HEAD(&cnflt->rc_node);  	init_timer(&cnflt->timer);  	cnflt->timer.function = uwb_cnflt_timer; @@ -608,7 +650,7 @@ static void uwb_drp_handle_alien_drp(struct uwb_rc *rc, struct uwb_ie_drp *drp_i  	cnflt->rc = rc;  	INIT_WORK(&cnflt->cnflt_update_work, uwb_cnflt_update_work); -	 +  	bitmap_copy(cnflt->mas.bm, mas.bm, UWB_NUM_MAS);  	list_add_tail(&cnflt->rc_node, &rc->cnflt_alien_list); @@ -617,17 +659,17 @@ static void uwb_drp_handle_alien_drp(struct uwb_rc *rc, struct uwb_ie_drp *drp_i  	bitmap_or(rc->cnflt_alien_bitmap.bm, rc->cnflt_alien_bitmap.bm, mas.bm, UWB_NUM_MAS);  	queue_delayed_work(rc->rsv_workq, &rc->rsv_alien_bp_work, usecs_to_jiffies(delay_us)); -	 +  	/* start the timer */  	uwb_cnflt_alien_stroke_timer(cnflt);  }  static void uwb_drp_process_not_involved(struct uwb_rc *rc, -					 struct uwb_rc_evt_drp *drp_evt,  +					 struct uwb_rc_evt_drp *drp_evt,  					 struct uwb_ie_drp *drp_ie)  {  	struct uwb_mas_bm mas; -	 +  	uwb_drp_ie_to_bm(&mas, drp_ie);  	uwb_drp_handle_all_conflict_rsv(rc, drp_evt, drp_ie, &mas);  } @@ -647,7 +689,7 @@ static void uwb_drp_process_involved(struct uwb_rc *rc, struct uwb_dev *src,  		 */  		return;  	} -	 +  	/*  	 * Do nothing with DRP IEs for reservations that have been  	 * terminated. @@ -656,12 +698,12 @@ static void uwb_drp_process_involved(struct uwb_rc *rc, struct uwb_dev *src,  		uwb_rsv_set_state(rsv, UWB_RSV_STATE_NONE);  		return;  	} -			 +  	if (uwb_ie_drp_owner(drp_ie))  		uwb_drp_process_target(rc, rsv, drp_ie, drp_evt);  	else  		uwb_drp_process_owner(rc, rsv, src, drp_ie, drp_evt); -	 +  } @@ -741,12 +783,12 @@ void uwb_drp_process_all(struct uwb_rc *rc, struct uwb_rc_evt_drp *drp_evt,   * DRP notifications can occur for three different reasons:   *   * - UWB_DRP_NOTIF_DRP_IE_RECVD: one or more DRP IEs with the RC as - *   the target or source have been recieved. + *   the target or source have been received.   *   *   These DRP IEs could be new or for an existing reservation.   *   *   If the DRP IE for an existing reservation ceases to be to - *   recieved for at least mMaxLostBeacons, the reservation should be + *   received for at least mMaxLostBeacons, the reservation should be   *   considered to be terminated.  Note that the TERMINATE reason (see   *   below) may not always be signalled (e.g., the remote device has   *   two or more reservations established with the RC). diff --git a/drivers/uwb/est.c b/drivers/uwb/est.c index a2eaa3c33b0..f3e23258428 100644 --- a/drivers/uwb/est.c +++ b/drivers/uwb/est.c @@ -41,6 +41,7 @@   */  #include <linux/spinlock.h>  #include <linux/slab.h> +#include <linux/export.h>  #include "uwb-internal.h" @@ -183,7 +184,7 @@ int uwb_est_create(void)  	uwb_est_size = 2;  	uwb_est_used = 0; -	uwb_est = kzalloc(uwb_est_size * sizeof(uwb_est[0]), GFP_KERNEL); +	uwb_est = kcalloc(uwb_est_size, sizeof(uwb_est[0]), GFP_KERNEL);  	if (uwb_est == NULL)  		return -ENOMEM; @@ -257,7 +258,6 @@ int uwb_est_register(u8 type, u8 event_high, u16 vendor, u16 product,  {  	unsigned long flags;  	unsigned itr; -	u16 type_event_high;  	int result = 0;  	write_lock_irqsave(&uwb_est_lock, flags); @@ -267,7 +267,6 @@ int uwb_est_register(u8 type, u8 event_high, u16 vendor, u16 product,  			goto out;  	}  	/* Find the right spot to insert it in */ -	type_event_high = type << 8 | event_high;  	for (itr = 0; itr < uwb_est_used; itr++)  		if (uwb_est[itr].type_event_high < type  		    && uwb_est[itr].vendor < vendor @@ -435,7 +434,6 @@ ssize_t uwb_est_find_size(struct uwb_rc *rc, const struct uwb_rceb *rceb,  	unsigned long flags;  	unsigned itr;  	u16 type_event_high, event; -	u8 *ptr = (u8 *) rceb;  	read_lock_irqsave(&uwb_est_lock, flags);  	size = -ENOSPC; @@ -452,12 +450,12 @@ ssize_t uwb_est_find_size(struct uwb_rc *rc, const struct uwb_rceb *rceb,  		if (size != -ENOENT)  			goto out;  	} -	dev_dbg(dev, "event 0x%02x/%04x/%02x: no handlers available; " -		"RCEB %02x %02x %02x %02x\n", +	dev_dbg(dev, +		"event 0x%02x/%04x/%02x: no handlers available; RCEB %4ph\n",  		(unsigned) rceb->bEventType,  		(unsigned) le16_to_cpu(rceb->wEvent),  		(unsigned) rceb->bEventContext, -		ptr[0], ptr[1], ptr[2], ptr[3]); +		rceb);  	size = -ENOENT;  out:  	read_unlock_irqrestore(&uwb_est_lock, flags); diff --git a/drivers/uwb/hwa-rc.c b/drivers/uwb/hwa-rc.c index 2babcd4fbfc..0257f35cfb9 100644 --- a/drivers/uwb/hwa-rc.c +++ b/drivers/uwb/hwa-rc.c @@ -611,7 +611,16 @@ static  int hwarc_reset(struct uwb_rc *uwb_rc)  {  	struct hwarc *hwarc = uwb_rc->priv; -	return usb_reset_device(hwarc->usb_dev); +	int result; + +	/* device lock must be held when calling usb_reset_device. */ +	result = usb_lock_device_for_reset(hwarc->usb_dev, NULL); +	if (result >= 0) { +		result = usb_reset_device(hwarc->usb_dev); +		usb_unlock_device(hwarc->usb_dev); +	} + +	return result;  }  /** @@ -645,7 +654,8 @@ void hwarc_neep_cb(struct urb *urb)  		dev_err(dev, "NEEP: URB error %d\n", urb->status);  	}  	result = usb_submit_urb(urb, GFP_ATOMIC); -	if (result < 0) { +	if (result < 0 && result != -ENODEV && result != -EPERM) { +		/* ignoring unrecoverable errors */  		dev_err(dev, "NEEP: Can't resubmit URB (%d) resetting device\n",  			result);  		goto error; @@ -708,8 +718,10 @@ static int hwarc_neep_init(struct uwb_rc *rc)  error_neep_submit:  	usb_free_urb(hwarc->neep_urb); +	hwarc->neep_urb = NULL;  error_urb_alloc:  	free_page((unsigned long)hwarc->rd_buffer); +	hwarc->rd_buffer = NULL;  error_rd_buffer:  	return -ENOMEM;  } @@ -722,7 +734,10 @@ static void hwarc_neep_release(struct uwb_rc *rc)  	usb_kill_urb(hwarc->neep_urb);  	usb_free_urb(hwarc->neep_urb); +	hwarc->neep_urb = NULL; +  	free_page((unsigned long)hwarc->rd_buffer); +	hwarc->rd_buffer = NULL;  }  /** @@ -899,6 +914,12 @@ static const struct usb_device_id hwarc_id_table[] = {  	/* Intel i1480 (using firmware 1.3PA2-20070828) */  	{ USB_DEVICE_AND_INTERFACE_INFO(0x8086, 0x0c3b, 0xe0, 0x01, 0x02),  	  .driver_info = WUSB_QUIRK_WHCI_CMD_EVT }, +	/* Alereon 5310 */ +	{ USB_DEVICE_AND_INTERFACE_INFO(0x13dc, 0x5310, 0xe0, 0x01, 0x02), +	  .driver_info = WUSB_QUIRK_WHCI_CMD_EVT }, +	/* Alereon 5611 */ +	{ USB_DEVICE_AND_INTERFACE_INFO(0x13dc, 0x5611, 0xe0, 0x01, 0x02), +	  .driver_info = WUSB_QUIRK_WHCI_CMD_EVT },  	/* Generic match for the Radio Control interface */  	{ USB_INTERFACE_INFO(0xe0, 0x01, 0x02), },  	{ }, @@ -914,17 +935,7 @@ static struct usb_driver hwarc_driver = {  	.post_reset =   hwarc_post_reset,  }; -static int __init hwarc_driver_init(void) -{ -	return usb_register(&hwarc_driver); -} -module_init(hwarc_driver_init); - -static void __exit hwarc_driver_exit(void) -{ -	usb_deregister(&hwarc_driver); -} -module_exit(hwarc_driver_exit); +module_usb_driver(hwarc_driver);  MODULE_AUTHOR("Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>");  MODULE_DESCRIPTION("Host Wireless Adapter Radio Control Driver"); diff --git a/drivers/uwb/i1480/dfu/dfu.c b/drivers/uwb/i1480/dfu/dfu.c index da7b1d08003..b08d1c2ee3f 100644 --- a/drivers/uwb/i1480/dfu/dfu.c +++ b/drivers/uwb/i1480/dfu/dfu.c @@ -33,6 +33,7 @@  #include <linux/device.h>  #include <linux/uwb.h>  #include <linux/random.h> +#include <linux/export.h>  /*   * i1480_rceb_check - Check RCEB for expected field values diff --git a/drivers/uwb/i1480/dfu/usb.c b/drivers/uwb/i1480/dfu/usb.c index ba8664328af..2bfc846ac07 100644 --- a/drivers/uwb/i1480/dfu/usb.c +++ b/drivers/uwb/i1480/dfu/usb.c @@ -104,7 +104,7 @@ void i1480_usb_destroy(struct i1480_usb *i1480_usb)   *   * Data buffers to USB cannot be on the stack or in vmalloc'ed areas,   * so we copy it to the local i1480 buffer before proceeding. In any - * case, we have a max size we can send, soooo. + * case, we have a max size we can send.   */  static  int i1480_usb_write(struct i1480 *i1480, u32 memory_address, @@ -451,25 +451,7 @@ static struct usb_driver i1480_dfu_driver = {  	.disconnect =	NULL,  }; - -/* - * Initialize the i1480 DFU driver. - * - * We also need to register our function for guessing event sizes. - */ -static int __init i1480_dfu_driver_init(void) -{ -	return usb_register(&i1480_dfu_driver); -} -module_init(i1480_dfu_driver_init); - - -static void __exit i1480_dfu_driver_exit(void) -{ -	usb_deregister(&i1480_dfu_driver); -} -module_exit(i1480_dfu_driver_exit); - +module_usb_driver(i1480_dfu_driver);  MODULE_AUTHOR("Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>");  MODULE_DESCRIPTION("Intel Wireless UWB Link 1480 firmware uploader for USB"); diff --git a/drivers/uwb/i1480/i1480-est.c b/drivers/uwb/i1480/i1480-est.c index f2eb4d8b76c..d5de5e131d4 100644 --- a/drivers/uwb/i1480/i1480-est.c +++ b/drivers/uwb/i1480/i1480-est.c @@ -91,7 +91,7 @@ MODULE_LICENSE("GPL");   *   * [so we are loaded when this kind device is connected]   */ -static struct usb_device_id i1480_est_id_table[] = { +static struct usb_device_id __used i1480_est_id_table[] = {  	{ USB_DEVICE(0x8086, 0xdf3b), },  	{ USB_DEVICE(0x8086, 0x0c3b), },  	{ }, diff --git a/drivers/uwb/ie-rcv.c b/drivers/uwb/ie-rcv.c index 917e6d78a79..5fac5744a69 100644 --- a/drivers/uwb/ie-rcv.c +++ b/drivers/uwb/ie-rcv.c @@ -31,7 +31,6 @@ int uwbd_evt_handle_rc_ie_rcv(struct uwb_event *evt)  	int result = -EINVAL;  	struct device *dev = &evt->rc->uwb_dev.dev;  	struct uwb_rc_evt_ie_rcv *iercv; -	size_t iesize;  	/* Is there enough data to decode it? */  	if (evt->notif.size < sizeof(*iercv)) { @@ -41,7 +40,6 @@ int uwbd_evt_handle_rc_ie_rcv(struct uwb_event *evt)  		goto error;  	}  	iercv = container_of(evt->notif.rceb, struct uwb_rc_evt_ie_rcv, rceb); -	iesize = le16_to_cpu(iercv->wIELength);  	dev_dbg(dev, "IE received, element ID=%d\n", iercv->IEData[0]); diff --git a/drivers/uwb/ie.c b/drivers/uwb/ie.c index 30acec74042..902b0f2f961 100644 --- a/drivers/uwb/ie.c +++ b/drivers/uwb/ie.c @@ -25,6 +25,7 @@   */  #include <linux/slab.h> +#include <linux/export.h>  #include "uwb-internal.h"  /** diff --git a/drivers/uwb/lc-dev.c b/drivers/uwb/lc-dev.c index 90113bafefc..80079b8fed1 100644 --- a/drivers/uwb/lc-dev.c +++ b/drivers/uwb/lc-dev.c @@ -25,9 +25,11 @@  #include <linux/kernel.h>  #include <linux/slab.h>  #include <linux/device.h> +#include <linux/export.h>  #include <linux/err.h>  #include <linux/kdev_t.h>  #include <linux/random.h> +#include <linux/stat.h>  #include "uwb-internal.h"  /* We initialize addresses to 0xff (invalid, as it is bcast) */ @@ -242,7 +244,7 @@ static ssize_t uwb_dev_RSSI_store(struct device *dev,  static DEVICE_ATTR(RSSI, S_IRUGO | S_IWUSR, uwb_dev_RSSI_show, uwb_dev_RSSI_store); -static struct attribute *dev_attrs[] = { +static struct attribute *uwb_dev_attrs[] = {  	&dev_attr_EUI_48.attr,  	&dev_attr_DevAddr.attr,  	&dev_attr_BPST.attr, @@ -251,20 +253,10 @@ static struct attribute *dev_attrs[] = {  	&dev_attr_RSSI.attr,  	NULL,  }; - -static struct attribute_group dev_attr_group = { -	.attrs = dev_attrs, -}; - -static const struct attribute_group *groups[] = { -	&dev_attr_group, -	NULL, -}; +ATTRIBUTE_GROUPS(uwb_dev);  /**   * Device SYSFS registration - * - *   */  static int __uwb_dev_sys_add(struct uwb_dev *uwb_dev, struct device *parent_dev)  { @@ -274,7 +266,7 @@ static int __uwb_dev_sys_add(struct uwb_dev *uwb_dev, struct device *parent_dev)  	/* Device sysfs files are only useful for neighbor devices not  	   local radio controllers. */  	if (&uwb_dev->rc->uwb_dev != uwb_dev) -		dev->groups = groups; +		dev->groups = uwb_dev_groups;  	dev->parent = parent_dev;  	dev_set_drvdata(dev, uwb_dev); @@ -438,7 +430,7 @@ void uwbd_dev_onair(struct uwb_rc *rc, struct uwb_beca_e *bce)  	uwb_dev_init(uwb_dev);		/* This sets refcnt to one, we own it */  	uwb_dev->mac_addr = *bce->mac_addr;  	uwb_dev->dev_addr = bce->dev_addr; -	dev_set_name(&uwb_dev->dev, macbuf); +	dev_set_name(&uwb_dev->dev, "%s", macbuf);  	result = uwb_dev_add(uwb_dev, &rc->uwb_dev.dev, rc);  	if (result < 0) {  		dev_err(dev, "new device %s: cannot instantiate device\n", diff --git a/drivers/uwb/lc-rc.c b/drivers/uwb/lc-rc.c index b0091c771b9..3eca6ceb984 100644 --- a/drivers/uwb/lc-rc.c +++ b/drivers/uwb/lc-rc.c @@ -36,12 +36,13 @@  #include <linux/etherdevice.h>  #include <linux/usb.h>  #include <linux/slab.h> +#include <linux/export.h>  #include "uwb-internal.h" -static int uwb_rc_index_match(struct device *dev, void *data) +static int uwb_rc_index_match(struct device *dev, const void *data)  { -	int *index = data; +	const int *index = data;  	struct uwb_rc *rc = dev_get_drvdata(dev);  	if (rc->index == *index) @@ -168,7 +169,7 @@ int uwb_rc_mac_addr_setup(struct uwb_rc *rc)  	}  	if (uwb_mac_addr_unset(&addr) || uwb_mac_addr_bcast(&addr)) { -		addr.data[0] = 0x02; /* locally adminstered and unicast */ +		addr.data[0] = 0x02; /* locally administered and unicast */  		get_random_bytes(&addr.data[1], sizeof(addr.data)-1);  		result = uwb_rc_mac_addr_set(rc, &addr); @@ -333,9 +334,9 @@ void uwb_rc_rm(struct uwb_rc *rc)  }  EXPORT_SYMBOL_GPL(uwb_rc_rm); -static int find_rc_try_get(struct device *dev, void *data) +static int find_rc_try_get(struct device *dev, const void *data)  { -	struct uwb_rc *target_rc = data; +	const struct uwb_rc *target_rc = data;  	struct uwb_rc *rc = dev_get_drvdata(dev);  	if (rc == NULL) { @@ -385,9 +386,9 @@ static inline struct uwb_rc *uwb_rc_get(struct uwb_rc *rc)  	return rc;  } -static int find_rc_grandpa(struct device *dev, void *data) +static int find_rc_grandpa(struct device *dev, const void *data)  { -	struct device *grandpa_dev = data; +	const struct device *grandpa_dev = data;  	struct uwb_rc *rc = dev_get_drvdata(dev);  	if (rc->uwb_dev.dev.parent->parent == grandpa_dev) { @@ -418,7 +419,7 @@ struct uwb_rc *uwb_rc_get_by_grandpa(const struct device *grandpa_dev)  	struct device *dev;  	struct uwb_rc *rc = NULL; -	dev = class_find_device(&uwb_rc_class, NULL, (void *)grandpa_dev, +	dev = class_find_device(&uwb_rc_class, NULL, grandpa_dev,  				find_rc_grandpa);  	if (dev)  		rc = dev_get_drvdata(dev); @@ -431,9 +432,9 @@ EXPORT_SYMBOL_GPL(uwb_rc_get_by_grandpa);   *   * @returns the pointer to the radio controller, properly referenced   */ -static int find_rc_dev(struct device *dev, void *data) +static int find_rc_dev(struct device *dev, const void *data)  { -	struct uwb_dev_addr *addr = data; +	const struct uwb_dev_addr *addr = data;  	struct uwb_rc *rc = dev_get_drvdata(dev);  	if (rc == NULL) { @@ -452,8 +453,7 @@ struct uwb_rc *uwb_rc_get_by_dev(const struct uwb_dev_addr *addr)  	struct device *dev;  	struct uwb_rc *rc = NULL; -	dev = class_find_device(&uwb_rc_class, NULL, (void *)addr, -				find_rc_dev); +	dev = class_find_device(&uwb_rc_class, NULL, addr, find_rc_dev);  	if (dev)  		rc = dev_get_drvdata(dev); diff --git a/drivers/uwb/neh.c b/drivers/uwb/neh.c index 697e56a5bcd..8cb71bb333c 100644 --- a/drivers/uwb/neh.c +++ b/drivers/uwb/neh.c @@ -85,6 +85,7 @@  #include <linux/timer.h>  #include <linux/slab.h>  #include <linux/err.h> +#include <linux/export.h>  #include "uwb-internal.h" @@ -106,6 +107,7 @@ struct uwb_rc_neh {  	u8 evt_type;  	__le16 evt;  	u8 context; +	u8 completed;  	uwb_rc_cmd_cb_f cb;  	void *arg; @@ -408,6 +410,7 @@ static void uwb_rc_neh_grok_event(struct uwb_rc *rc, struct uwb_rceb *rceb, size  	struct device *dev = &rc->uwb_dev.dev;  	struct uwb_rc_neh *neh;  	struct uwb_rceb *notif; +	unsigned long flags;  	if (rceb->bEventContext == 0) {  		notif = kmalloc(size, GFP_ATOMIC); @@ -421,7 +424,11 @@ static void uwb_rc_neh_grok_event(struct uwb_rc *rc, struct uwb_rceb *rceb, size  	} else {  		neh = uwb_rc_neh_lookup(rc, rceb);  		if (neh) { -			del_timer_sync(&neh->timer); +			spin_lock_irqsave(&rc->neh_lock, flags); +			/* to guard against a timeout */ +			neh->completed = 1; +			del_timer(&neh->timer); +			spin_unlock_irqrestore(&rc->neh_lock, flags);  			uwb_rc_neh_cb(neh, rceb, size);  		} else  			dev_warn(dev, "event 0x%02x/%04x/%02x (%zu bytes): nobody cared\n", @@ -567,6 +574,10 @@ static void uwb_rc_neh_timer(unsigned long arg)  	unsigned long flags;  	spin_lock_irqsave(&rc->neh_lock, flags); +	if (neh->completed) { +		spin_unlock_irqrestore(&rc->neh_lock, flags); +		return; +	}  	if (neh->context)  		__uwb_rc_neh_rm(rc, neh);  	else diff --git a/drivers/uwb/pal.c b/drivers/uwb/pal.c index 99a19c19909..c1304b8d498 100644 --- a/drivers/uwb/pal.c +++ b/drivers/uwb/pal.c @@ -18,6 +18,7 @@  #include <linux/kernel.h>  #include <linux/debugfs.h>  #include <linux/uwb.h> +#include <linux/export.h>  #include "uwb-internal.h" @@ -43,10 +44,12 @@ int uwb_pal_register(struct uwb_pal *pal)  	int ret;  	if (pal->device) { +		/* create a link to the uwb_rc in the PAL device's directory. */  		ret = sysfs_create_link(&pal->device->kobj,  					&rc->uwb_dev.dev.kobj, "uwb_rc");  		if (ret < 0)  			return ret; +		/* create a link to the PAL in the UWB device's directory. */  		ret = sysfs_create_link(&rc->uwb_dev.dev.kobj,  					&pal->device->kobj, pal->name);  		if (ret < 0) { @@ -65,8 +68,40 @@ int uwb_pal_register(struct uwb_pal *pal)  }  EXPORT_SYMBOL_GPL(uwb_pal_register); +static int find_rc(struct device *dev, const void *data) +{ +	const struct uwb_rc *target_rc = data; +	struct uwb_rc *rc = dev_get_drvdata(dev); + +	if (rc == NULL) { +		WARN_ON(1); +		return 0; +	} +	if (rc == target_rc) { +		if (rc->ready == 0) +			return 0; +		else +			return 1; +	} +	return 0; +} + +/** + * Given a radio controller descriptor see if it is registered. + * + * @returns false if the rc does not exist or is quiescing; true otherwise. + */ +static bool uwb_rc_class_device_exists(struct uwb_rc *target_rc) +{ +	struct device *dev; + +	dev = class_find_device(&uwb_rc_class, NULL, target_rc,	find_rc); + +	return (dev != NULL); +} +  /** - * uwb_pal_register - unregister a UWB PAL + * uwb_pal_unregister - unregister a UWB PAL   * @pal: the PAL   */  void uwb_pal_unregister(struct uwb_pal *pal) @@ -82,7 +117,11 @@ void uwb_pal_unregister(struct uwb_pal *pal)  	debugfs_remove(pal->debugfs_dir);  	if (pal->device) { -		sysfs_remove_link(&rc->uwb_dev.dev.kobj, pal->name); +		/* remove link to the PAL in the UWB device's directory. */ +		if (uwb_rc_class_device_exists(rc)) +			sysfs_remove_link(&rc->uwb_dev.dev.kobj, pal->name); + +		/* remove link to uwb_rc in the PAL device's directory. */  		sysfs_remove_link(&pal->device->kobj, "uwb_rc");  	}  } diff --git a/drivers/uwb/radio.c b/drivers/uwb/radio.c index f0d55495f5e..2427e944883 100644 --- a/drivers/uwb/radio.c +++ b/drivers/uwb/radio.c @@ -17,6 +17,7 @@   */  #include <linux/kernel.h>  #include <linux/uwb.h> +#include <linux/export.h>  #include "uwb-internal.h" @@ -61,6 +62,10 @@ static void uwb_radio_channel_changed(struct uwb_rc *rc, int channel)  static int uwb_radio_change_channel(struct uwb_rc *rc, int channel)  {  	int ret = 0; +	struct device *dev = &rc->uwb_dev.dev; + +	dev_dbg(dev, "%s: channel = %d, rc->beaconing = %d\n", __func__, +		channel, rc->beaconing);  	if (channel == -1)  		uwb_radio_channel_changed(rc, channel); @@ -88,7 +93,7 @@ static int uwb_radio_change_channel(struct uwb_rc *rc, int channel)   * uwb_radio_start - request that the radio be started   * @pal: the PAL making the request.   * - * If the radio is not already active, aa suitable channel is selected + * If the radio is not already active, a suitable channel is selected   * and beacons are started.   */  int uwb_radio_start(struct uwb_pal *pal) @@ -110,7 +115,7 @@ int uwb_radio_start(struct uwb_pal *pal)  EXPORT_SYMBOL_GPL(uwb_radio_start);  /** - * uwb_radio_stop - request tha the radio be stopped. + * uwb_radio_stop - request that the radio be stopped.   * @pal: the PAL making the request.   *   * Stops the radio if no other PAL is making use of it. diff --git a/drivers/uwb/reset.c b/drivers/uwb/reset.c index 27849292b55..8b47c9cdd64 100644 --- a/drivers/uwb/reset.c +++ b/drivers/uwb/reset.c @@ -32,6 +32,7 @@  #include <linux/err.h>  #include <linux/slab.h>  #include <linux/delay.h> +#include <linux/export.h>  #include "uwb-internal.h" @@ -52,7 +53,7 @@ const char *__strerror[] = {  	"cancelled",  	"invalid state",  	"invalid size", -	"ack not recieved", +	"ack not received",  	"no more asie notification",  }; @@ -96,6 +97,7 @@ int uwb_rc_cmd_async(struct uwb_rc *rc, const char *cmd_name,  	neh = uwb_rc_neh_add(rc, cmd, expected_type, expected_event, cb, arg);  	if (IS_ERR(neh)) {  		result = PTR_ERR(neh); +		uwb_dev_unlock(&rc->uwb_dev);  		goto out;  	} diff --git a/drivers/uwb/rsv.c b/drivers/uwb/rsv.c index 78c892233cf..0887ae98278 100644 --- a/drivers/uwb/rsv.c +++ b/drivers/uwb/rsv.c @@ -19,6 +19,7 @@  #include <linux/uwb.h>  #include <linux/slab.h>  #include <linux/random.h> +#include <linux/export.h>  #include "uwb-internal.h" @@ -162,8 +163,10 @@ static int uwb_rsv_get_stream(struct uwb_rsv *rsv)  	}  	stream = find_first_zero_bit(streams_bm, UWB_NUM_STREAMS); -	if (stream >= UWB_NUM_STREAMS) +	if (stream >= UWB_NUM_STREAMS) { +		dev_err(dev, "%s: no available stream found\n", __func__);  		return -EBUSY; +	}  	rsv->stream = stream;  	set_bit(stream, streams_bm); @@ -230,13 +233,13 @@ void uwb_rsv_backoff_win_increment(struct uwb_rc *rc)  		return;  	bow->window <<= 1; -	bow->n = random32() & (bow->window - 1); +	bow->n = prandom_u32() & (bow->window - 1);  	dev_dbg(dev, "new_window=%d, n=%d\n: ", bow->window, bow->n);  	/* reset the timer associated variables */  	timeout_us = bow->n * UWB_SUPERFRAME_LENGTH_US;  	bow->total_expired = 0; -	mod_timer(&bow->timer, jiffies + usecs_to_jiffies(timeout_us));		 +	mod_timer(&bow->timer, jiffies + usecs_to_jiffies(timeout_us));  }  static void uwb_rsv_stroke_timer(struct uwb_rsv *rsv) @@ -248,7 +251,9 @@ static void uwb_rsv_stroke_timer(struct uwb_rsv *rsv)  	 * super frame and should not be terminated if no response is  	 * received.  	 */ -	if (rsv->is_multicast) { +	if (rsv->state == UWB_RSV_STATE_NONE) { +		sframes = 0; +	} else if (rsv->is_multicast) {  		if (rsv->state == UWB_RSV_STATE_O_INITIATED  		    || rsv->state == UWB_RSV_STATE_O_MOVE_EXPANDING  		    || rsv->state == UWB_RSV_STATE_O_MOVE_COMBINING @@ -256,7 +261,7 @@ static void uwb_rsv_stroke_timer(struct uwb_rsv *rsv)  			sframes = 1;  		if (rsv->state == UWB_RSV_STATE_O_ESTABLISHED)  			sframes = 0; -		 +  	}  	if (sframes > 0) { @@ -321,6 +326,7 @@ void uwb_rsv_set_state(struct uwb_rsv *rsv, enum uwb_rsv_state new_state)  	switch (new_state) {  	case UWB_RSV_STATE_NONE:  		uwb_rsv_state_update(rsv, UWB_RSV_STATE_NONE); +		uwb_rsv_remove(rsv);  		uwb_rsv_callback(rsv);  		break;  	case UWB_RSV_STATE_O_INITIATED: @@ -441,6 +447,8 @@ static void uwb_rsv_handle_timeout_work(struct work_struct *work)  		uwb_rsv_set_state(rsv, UWB_RSV_STATE_T_ACCEPTED);  		uwb_drp_avail_release(rsv->rc, &rsv->mv.companion_mas);  		goto unlock; +	case UWB_RSV_STATE_NONE: +		goto unlock;  	default:  		break;  	} @@ -549,14 +557,18 @@ int uwb_rsv_establish(struct uwb_rsv *rsv)  {  	struct uwb_rc *rc = rsv->rc;  	struct uwb_mas_bm available; +	struct device *dev = &rc->uwb_dev.dev;  	int ret;  	mutex_lock(&rc->rsvs_mutex);  	ret = uwb_rsv_get_stream(rsv); -	if (ret) +	if (ret) { +		dev_err(dev, "%s: uwb_rsv_get_stream failed: %d\n", +			__func__, ret);  		goto out; +	} -	rsv->tiebreaker = random32() & 1; +	rsv->tiebreaker = prandom_u32() & 1;  	/* get available mas bitmap */  	uwb_drp_available(rc, &available); @@ -564,12 +576,16 @@ int uwb_rsv_establish(struct uwb_rsv *rsv)  	if (ret == UWB_RSV_ALLOC_NOT_FOUND) {  		ret = -EBUSY;  		uwb_rsv_put_stream(rsv); +		dev_err(dev, "%s: uwb_rsv_find_best_allocation failed: %d\n", +			__func__, ret);  		goto out;  	}  	ret = uwb_drp_avail_reserve_pending(rc, &rsv->mas);  	if (ret != 0) {  		uwb_rsv_put_stream(rsv); +		dev_err(dev, "%s: uwb_drp_avail_reserve_pending failed: %d\n", +			__func__, ret);  		goto out;  	} @@ -610,7 +626,7 @@ int uwb_rsv_try_move(struct uwb_rsv *rsv, struct uwb_mas_bm *available)  	struct device *dev = &rc->uwb_dev.dev;  	struct uwb_rsv_move *mv;  	int ret = 0; -  +  	if (bow->can_reserve_extra_mases == false)  		return -EBUSY; @@ -627,7 +643,7 @@ int uwb_rsv_try_move(struct uwb_rsv *rsv, struct uwb_mas_bm *available)  	} else {  		dev_dbg(dev, "new allocation not found\n");  	} -	 +  	return ret;  } @@ -639,7 +655,7 @@ void uwb_rsv_handle_drp_avail_change(struct uwb_rc *rc)  	struct uwb_drp_backoff_win *bow = &rc->bow;  	struct uwb_rsv *rsv;  	struct uwb_mas_bm mas; -	 +  	if (bow->can_reserve_extra_mases == false)  		return; @@ -651,7 +667,7 @@ void uwb_rsv_handle_drp_avail_change(struct uwb_rc *rc)  			uwb_rsv_try_move(rsv, &mas);  		}  	} -	 +  }  /** @@ -871,7 +887,7 @@ void uwb_rsv_queue_update(struct uwb_rc *rc)   */  void uwb_rsv_sched_update(struct uwb_rc *rc)  { -	spin_lock_bh(&rc->rsvs_lock); +	spin_lock_irq(&rc->rsvs_lock);  	if (!delayed_work_pending(&rc->rsv_update_work)) {  		if (rc->set_drp_ie_pending > 0) {  			rc->set_drp_ie_pending++; @@ -880,7 +896,7 @@ void uwb_rsv_sched_update(struct uwb_rc *rc)  		uwb_rsv_queue_update(rc);  	}  unlock: -	spin_unlock_bh(&rc->rsvs_lock); +	spin_unlock_irq(&rc->rsvs_lock);  }  /* @@ -915,10 +931,10 @@ static void uwb_rsv_alien_bp_work(struct work_struct *work)  	struct uwb_rsv *rsv;  	mutex_lock(&rc->rsvs_mutex); -	 +  	list_for_each_entry(rsv, &rc->reservations, rc_node) {  		if (rsv->type != UWB_DRP_TYPE_ALIEN_BP) { -			rsv->callback(rsv); +			uwb_rsv_callback(rsv);  		}  	} diff --git a/drivers/uwb/scan.c b/drivers/uwb/scan.c index 76a1a1ed7d3..cbb6a5e703d 100644 --- a/drivers/uwb/scan.c +++ b/drivers/uwb/scan.c @@ -36,13 +36,14 @@  #include <linux/device.h>  #include <linux/err.h>  #include <linux/slab.h> +#include <linux/stat.h>  #include "uwb-internal.h"  /**   * Start/stop scanning in a radio controller   * - * @rc:      UWB Radio Controlller + * @rc:      UWB Radio Controller   * @channel: Channel to scan; encodings in WUSB1.0[Table 5.12]   * @type:    Type of scanning to do.   * @bpst_offset: value at which to start scanning (if type == diff --git a/drivers/uwb/umc-bus.c b/drivers/uwb/umc-bus.c index 5fad4e791b3..88a290f57ea 100644 --- a/drivers/uwb/umc-bus.c +++ b/drivers/uwb/umc-bus.c @@ -8,6 +8,7 @@  #include <linux/kernel.h>  #include <linux/sysfs.h>  #include <linux/workqueue.h> +#include <linux/module.h>  #include <linux/uwb/umc.h>  #include <linux/pci.h> @@ -62,7 +63,7 @@ int umc_controller_reset(struct umc_dev *umc)  	struct device *parent = umc->dev.parent;  	int ret = 0; -	if (device_trylock(parent)) +	if (!device_trylock(parent))  		return -EAGAIN;  	ret = device_for_each_child(parent, parent, umc_bus_pre_reset_helper);  	if (ret >= 0) @@ -84,7 +85,7 @@ int umc_match_pci_id(struct umc_driver *umc_drv, struct umc_dev *umc)  	const struct pci_device_id *id_table = umc_drv->match_data;  	struct pci_dev *pci; -	if (umc->dev.parent->bus != &pci_bus_type) +	if (!dev_is_pci(umc->dev.parent))  		return 0;  	pci = to_pci_dev(umc->dev.parent); @@ -200,6 +201,7 @@ static ssize_t capability_id_show(struct device *dev, struct device_attribute *a  	return sprintf(buf, "0x%02x\n", umc->cap_id);  } +static DEVICE_ATTR_RO(capability_id);  static ssize_t version_show(struct device *dev, struct device_attribute *attr, char *buf)  { @@ -207,12 +209,14 @@ static ssize_t version_show(struct device *dev, struct device_attribute *attr, c  	return sprintf(buf, "0x%04x\n", umc->version);  } +static DEVICE_ATTR_RO(version); -static struct device_attribute umc_dev_attrs[] = { -	__ATTR_RO(capability_id), -	__ATTR_RO(version), -	__ATTR_NULL, +static struct attribute *umc_dev_attrs[] = { +	&dev_attr_capability_id.attr, +	&dev_attr_version.attr, +	NULL,  }; +ATTRIBUTE_GROUPS(umc_dev);  struct bus_type umc_bus_type = {  	.name		= "umc", @@ -221,7 +225,7 @@ struct bus_type umc_bus_type = {  	.remove		= umc_device_remove,  	.suspend        = umc_device_suspend,  	.resume         = umc_device_resume, -	.dev_attrs	= umc_dev_attrs, +	.dev_groups	= umc_dev_groups,  };  EXPORT_SYMBOL_GPL(umc_bus_type); diff --git a/drivers/uwb/umc-dev.c b/drivers/uwb/umc-dev.c index 43ea9982e68..7b0b268e0c8 100644 --- a/drivers/uwb/umc-dev.c +++ b/drivers/uwb/umc-dev.c @@ -6,6 +6,7 @@   * This file is released under the GNU GPL v2.   */  #include <linux/kernel.h> +#include <linux/export.h>  #include <linux/slab.h>  #include <linux/uwb/umc.h> @@ -54,11 +55,8 @@ int umc_device_register(struct umc_dev *umc)  	err = request_resource(umc->resource.parent, &umc->resource);  	if (err < 0) { -		dev_err(&umc->dev, "can't allocate resource range " -			"%016Lx to %016Lx: %d\n", -			(unsigned long long)umc->resource.start, -			(unsigned long long)umc->resource.end, -			err); +		dev_err(&umc->dev, "can't allocate resource range %pR: %d\n", +			&umc->resource, err);  		goto error_request_resource;  	} @@ -68,6 +66,7 @@ int umc_device_register(struct umc_dev *umc)  	return 0;  error_device_register: +	put_device(&umc->dev);  	release_resource(&umc->resource);  error_request_resource:  	return err; @@ -81,7 +80,7 @@ EXPORT_SYMBOL_GPL(umc_device_register);   * First we unregister the device, make sure the driver can do it's   * resource release thing and then we try to release any left over   * resources. We take a ref to the device, to make sure it doesn't - * dissapear under our feet. + * disappear under our feet.   */  void umc_device_unregister(struct umc_dev *umc)  { diff --git a/drivers/uwb/umc-drv.c b/drivers/uwb/umc-drv.c index 367b5eb85d6..26d0ae1816b 100644 --- a/drivers/uwb/umc-drv.c +++ b/drivers/uwb/umc-drv.c @@ -6,6 +6,7 @@   * This file is released under the GNU GPL v2.   */  #include <linux/kernel.h> +#include <linux/export.h>  #include <linux/uwb/umc.h>  int __umc_driver_register(struct umc_driver *umc_drv, struct module *module, diff --git a/drivers/uwb/uwb-debug.c b/drivers/uwb/uwb-debug.c index 2eecec0c13c..6ec45beb7af 100644 --- a/drivers/uwb/uwb-debug.c +++ b/drivers/uwb/uwb-debug.c @@ -159,13 +159,6 @@ static int cmd_ie_rm(struct uwb_rc *rc, struct uwb_dbg_cmd_ie *ie_to_rm)  	return uwb_rc_ie_rm(rc, ie_to_rm->data[0]);  } -static int command_open(struct inode *inode, struct file *file) -{ -	file->private_data = inode->i_private; - -	return 0; -} -  static ssize_t command_write(struct file *file, const char __user *buf,  			 size_t len, loff_t *off)  { @@ -206,7 +199,7 @@ static ssize_t command_write(struct file *file, const char __user *buf,  }  static const struct file_operations command_fops = { -	.open   = command_open, +	.open	= simple_open,  	.write  = command_write,  	.read   = NULL,  	.llseek = no_llseek, diff --git a/drivers/uwb/uwb-internal.h b/drivers/uwb/uwb-internal.h index 157485c862c..9a103b100f1 100644 --- a/drivers/uwb/uwb-internal.h +++ b/drivers/uwb/uwb-internal.h @@ -28,7 +28,6 @@  #ifndef __UWB_INTERNAL_H__  #define __UWB_INTERNAL_H__ -#include <linux/version.h>  #include <linux/kernel.h>  #include <linux/device.h>  #include <linux/uwb.h> @@ -56,7 +55,8 @@ static inline struct uwb_rc *__uwb_rc_get(struct uwb_rc *rc)  static inline void __uwb_rc_put(struct uwb_rc *rc)  { -	uwb_dev_put(&rc->uwb_dev); +	if (rc) +		uwb_dev_put(&rc->uwb_dev);  }  extern int uwb_rc_reset(struct uwb_rc *rc); diff --git a/drivers/uwb/uwbd.c b/drivers/uwb/uwbd.c index 001c8b4020a..bdcb13cc1d5 100644 --- a/drivers/uwb/uwbd.c +++ b/drivers/uwb/uwbd.c @@ -256,7 +256,7 @@ static void uwbd_event_handle(struct uwb_event *evt)   * UWB Daemon   *   * Listens to all UWB notifications and takes care to track the state - * of the UWB neighboorhood for the kernel. When we do a run, we + * of the UWB neighbourhood for the kernel. When we do a run, we   * spinlock, move the list to a private copy and release the   * lock. Hold it as little as possible. Not a conflict: it is   * guaranteed we own the events in the private list. diff --git a/drivers/uwb/whc-rc.c b/drivers/uwb/whc-rc.c index 73495583c44..3ae3c702500 100644 --- a/drivers/uwb/whc-rc.c +++ b/drivers/uwb/whc-rc.c @@ -222,7 +222,7 @@ int whcrc_setup_rc_umc(struct whcrc *whcrc)  	struct umc_dev *umc_dev = whcrc->umc_dev;  	whcrc->area = umc_dev->resource.start; -	whcrc->rc_len = umc_dev->resource.end - umc_dev->resource.start + 1; +	whcrc->rc_len = resource_size(&umc_dev->resource);  	result = -EBUSY;  	if (request_mem_region(whcrc->area, whcrc->rc_len, KBUILD_MODNAME) == NULL) {  		dev_err(dev, "can't request URC region (%zu bytes @ 0x%lx): %d\n", @@ -449,7 +449,7 @@ static int whcrc_post_reset(struct umc_dev *umc)  }  /* PCI device ID's that we handle [so it gets loaded] */ -static struct pci_device_id whcrc_id_table[] = { +static struct pci_device_id __used whcrc_id_table[] = {  	{ PCI_DEVICE_CLASS(PCI_CLASS_WIRELESS_WHCI, ~0) },  	{ /* empty last entry */ }  }; diff --git a/drivers/uwb/whci.c b/drivers/uwb/whci.c index b221142446a..c9df8ba97da 100644 --- a/drivers/uwb/whci.c +++ b/drivers/uwb/whci.c @@ -7,6 +7,7 @@   */  #include <linux/delay.h>  #include <linux/kernel.h> +#include <linux/module.h>  #include <linux/pci.h>  #include <linux/dma-mapping.h>  #include <linux/slab.h> @@ -252,19 +253,7 @@ static struct pci_driver whci_driver = {  	.remove   = whci_remove,  }; -static int __init whci_init(void) -{ -	return pci_register_driver(&whci_driver); -} - -static void __exit whci_exit(void) -{ -	pci_unregister_driver(&whci_driver); -} - -module_init(whci_init); -module_exit(whci_exit); - +module_pci_driver(whci_driver);  MODULE_DESCRIPTION("WHCI UWB Multi-interface Controller enumerator");  MODULE_AUTHOR("Cambridge Silicon Radio Ltd.");  MODULE_LICENSE("GPL");  | 
