diff options
Diffstat (limited to 'drivers/misc/cardreader/rtsx_usb.c')
| -rw-r--r-- | drivers/misc/cardreader/rtsx_usb.c | 27 | 
1 files changed, 19 insertions, 8 deletions
diff --git a/drivers/misc/cardreader/rtsx_usb.c b/drivers/misc/cardreader/rtsx_usb.c index 1ef9b61077c4..f150d8769f19 100644 --- a/drivers/misc/cardreader/rtsx_usb.c +++ b/drivers/misc/cardreader/rtsx_usb.c @@ -631,16 +631,20 @@ static int rtsx_usb_probe(struct usb_interface *intf,  	ucr->pusb_dev = usb_dev; -	ucr->iobuf = usb_alloc_coherent(ucr->pusb_dev, IOBUF_SIZE, -			GFP_KERNEL, &ucr->iobuf_dma); -	if (!ucr->iobuf) +	ucr->cmd_buf = kmalloc(IOBUF_SIZE, GFP_KERNEL); +	if (!ucr->cmd_buf)  		return -ENOMEM; +	ucr->rsp_buf = kmalloc(IOBUF_SIZE, GFP_KERNEL); +	if (!ucr->rsp_buf) { +		ret = -ENOMEM; +		goto out_free_cmd_buf; +	} +  	usb_set_intfdata(intf, ucr);  	ucr->vendor_id = id->idVendor;  	ucr->product_id = id->idProduct; -	ucr->cmd_buf = ucr->rsp_buf = ucr->iobuf;  	mutex_init(&ucr->dev_mutex); @@ -668,8 +672,11 @@ static int rtsx_usb_probe(struct usb_interface *intf,  out_init_fail:  	usb_set_intfdata(ucr->pusb_intf, NULL); -	usb_free_coherent(ucr->pusb_dev, IOBUF_SIZE, ucr->iobuf, -			ucr->iobuf_dma); +	kfree(ucr->rsp_buf); +	ucr->rsp_buf = NULL; +out_free_cmd_buf: +	kfree(ucr->cmd_buf); +	ucr->cmd_buf = NULL;  	return ret;  } @@ -682,8 +689,12 @@ static void rtsx_usb_disconnect(struct usb_interface *intf)  	mfd_remove_devices(&intf->dev);  	usb_set_intfdata(ucr->pusb_intf, NULL); -	usb_free_coherent(ucr->pusb_dev, IOBUF_SIZE, ucr->iobuf, -			ucr->iobuf_dma); + +	kfree(ucr->cmd_buf); +	ucr->cmd_buf = NULL; + +	kfree(ucr->rsp_buf); +	ucr->rsp_buf = NULL;  }  #ifdef CONFIG_PM  |