diff options
Diffstat (limited to 'drivers/usb/wusbcore/devconnect.c')
| -rw-r--r-- | drivers/usb/wusbcore/devconnect.c | 82 | 
1 files changed, 31 insertions, 51 deletions
diff --git a/drivers/usb/wusbcore/devconnect.c b/drivers/usb/wusbcore/devconnect.c index 33a12788f9c..0677139c606 100644 --- a/drivers/usb/wusbcore/devconnect.c +++ b/drivers/usb/wusbcore/devconnect.c @@ -97,18 +97,12 @@ static void wusbhc_devconnect_acked_work(struct work_struct *work);  static void wusb_dev_free(struct wusb_dev *wusb_dev)  { -	if (wusb_dev) { -		kfree(wusb_dev->set_gtk_req); -		usb_free_urb(wusb_dev->set_gtk_urb); -		kfree(wusb_dev); -	} +	kfree(wusb_dev);  }  static struct wusb_dev *wusb_dev_alloc(struct wusbhc *wusbhc)  {  	struct wusb_dev *wusb_dev; -	struct urb *urb; -	struct usb_ctrlrequest *req;  	wusb_dev = kzalloc(sizeof(*wusb_dev), GFP_KERNEL);  	if (wusb_dev == NULL) @@ -118,22 +112,6 @@ static struct wusb_dev *wusb_dev_alloc(struct wusbhc *wusbhc)  	INIT_WORK(&wusb_dev->devconnect_acked_work, wusbhc_devconnect_acked_work); -	urb = usb_alloc_urb(0, GFP_KERNEL); -	if (urb == NULL) -		goto err; -	wusb_dev->set_gtk_urb = urb; - -	req = kmalloc(sizeof(*req), GFP_KERNEL); -	if (req == NULL) -		goto err; -	wusb_dev->set_gtk_req = req; - -	req->bRequestType = USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE; -	req->bRequest = USB_REQ_SET_DESCRIPTOR; -	req->wValue = cpu_to_le16(USB_DT_KEY << 8 | wusbhc->gtk_index); -	req->wIndex = 0; -	req->wLength = cpu_to_le16(wusbhc->gtk.descr.bLength); -  	return wusb_dev;  err:  	wusb_dev_free(wusb_dev); @@ -287,9 +265,9 @@ static void wusbhc_devconnect_acked_work(struct work_struct *work)   * Addresses: because WUSB hosts have no downstream hubs, we can do a   *            1:1 mapping between 'port number' and device   *            address. This simplifies many things, as during this - *            initial connect phase the USB stack has no knoledge of + *            initial connect phase the USB stack has no knowledge of   *            the device and hasn't assigned an address yet--we know - *            USB's choose_address() will use the same euristics we + *            USB's choose_address() will use the same heuristics we   *            use here, so we can assume which address will be assigned.   *   *            USB stack always assigns address 1 to the root hub, so @@ -306,7 +284,7 @@ void wusbhc_devconnect_ack(struct wusbhc *wusbhc, struct wusb_dn_connect *dnc,  	struct device *dev = wusbhc->dev;  	struct wusb_dev *wusb_dev;  	struct wusb_port *port; -	unsigned idx, devnum; +	unsigned idx;  	mutex_lock(&wusbhc->mutex); @@ -334,8 +312,6 @@ void wusbhc_devconnect_ack(struct wusbhc *wusbhc, struct wusb_dn_connect *dnc,  		goto error_unlock;  	} -	devnum = idx + 2; -  	/* Make sure we are using no crypto on that "virtual port" */  	wusbhc->set_ptk(wusbhc, idx, 0, NULL, 0); @@ -411,9 +387,6 @@ static void __wusbhc_dev_disconnect(struct wusbhc *wusbhc,  /*   * Refresh the list of keep alives to emit in the MMC   * - * Some devices don't respond to keep alives unless they've been - * authenticated, so skip unauthenticated devices. - *   * We only publish the first four devices that have a coming timeout   * condition. Then when we are done processing those, we go for the   * next ones. We ignore the ones that have timed out already (they'll @@ -448,7 +421,7 @@ static void __wusbhc_keep_alive(struct wusbhc *wusbhc)  		if (wusb_dev == NULL)  			continue; -		if (wusb_dev->usb_dev == NULL || !wusb_dev->usb_dev->authenticated) +		if (wusb_dev->usb_dev == NULL)  			continue;  		if (time_after(jiffies, wusb_dev->entry_ts + tt)) { @@ -524,11 +497,19 @@ static struct wusb_dev *wusbhc_find_dev_by_addr(struct wusbhc *wusbhc, u8 addr)   *   * @wusbhc shall be referenced and unlocked   */ -static void wusbhc_handle_dn_alive(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev) +static void wusbhc_handle_dn_alive(struct wusbhc *wusbhc, u8 srcaddr)  { +	struct wusb_dev *wusb_dev; +  	mutex_lock(&wusbhc->mutex); -	wusb_dev->entry_ts = jiffies; -	__wusbhc_keep_alive(wusbhc); +	wusb_dev = wusbhc_find_dev_by_addr(wusbhc, srcaddr); +	if (wusb_dev == NULL) { +		dev_dbg(wusbhc->dev, "ignoring DN_Alive from unconnected device %02x\n", +			srcaddr); +	} else { +		wusb_dev->entry_ts = jiffies; +		__wusbhc_keep_alive(wusbhc); +	}  	mutex_unlock(&wusbhc->mutex);  } @@ -582,14 +563,22 @@ static void wusbhc_handle_dn_connect(struct wusbhc *wusbhc,   *   * @wusbhc shall be referenced and unlocked   */ -static void wusbhc_handle_dn_disconnect(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev) +static void wusbhc_handle_dn_disconnect(struct wusbhc *wusbhc, u8 srcaddr)  {  	struct device *dev = wusbhc->dev; - -	dev_info(dev, "DN DISCONNECT: device 0x%02x going down\n", wusb_dev->addr); +	struct wusb_dev *wusb_dev;  	mutex_lock(&wusbhc->mutex); -	__wusbhc_dev_disconnect(wusbhc, wusb_port_by_idx(wusbhc, wusb_dev->port_idx)); +	wusb_dev = wusbhc_find_dev_by_addr(wusbhc, srcaddr); +	if (wusb_dev == NULL) { +		dev_dbg(dev, "ignoring DN DISCONNECT from unconnected device %02x\n", +			srcaddr); +	} else { +		dev_info(dev, "DN DISCONNECT: device 0x%02x going down\n", +			wusb_dev->addr); +		__wusbhc_dev_disconnect(wusbhc, wusb_port_by_idx(wusbhc, +			wusb_dev->port_idx)); +	}  	mutex_unlock(&wusbhc->mutex);  } @@ -611,30 +600,21 @@ void wusbhc_handle_dn(struct wusbhc *wusbhc, u8 srcaddr,  		      struct wusb_dn_hdr *dn_hdr, size_t size)  {  	struct device *dev = wusbhc->dev; -	struct wusb_dev *wusb_dev;  	if (size < sizeof(struct wusb_dn_hdr)) {  		dev_err(dev, "DN data shorter than DN header (%d < %d)\n",  			(int)size, (int)sizeof(struct wusb_dn_hdr));  		return;  	} - -	wusb_dev = wusbhc_find_dev_by_addr(wusbhc, srcaddr); -	if (wusb_dev == NULL && dn_hdr->bType != WUSB_DN_CONNECT) { -		dev_dbg(dev, "ignoring DN %d from unconnected device %02x\n", -			dn_hdr->bType, srcaddr); -		return; -	} -  	switch (dn_hdr->bType) {  	case WUSB_DN_CONNECT:  		wusbhc_handle_dn_connect(wusbhc, dn_hdr, size);  		break;  	case WUSB_DN_ALIVE: -		wusbhc_handle_dn_alive(wusbhc, wusb_dev); +		wusbhc_handle_dn_alive(wusbhc, srcaddr);  		break;  	case WUSB_DN_DISCONNECT: -		wusbhc_handle_dn_disconnect(wusbhc, wusb_dev); +		wusbhc_handle_dn_disconnect(wusbhc, srcaddr);  		break;  	case WUSB_DN_MASAVAILCHANGED:  	case WUSB_DN_RWAKE: @@ -973,7 +953,7 @@ int wusb_usb_ncb(struct notifier_block *nb, unsigned long val,  	default:  		WARN_ON(1);  		result = NOTIFY_BAD; -	}; +	}  	return result;  }  | 
