@@ -47,46 +47,40 @@ MODULE_DEVICE_TABLE(usb, ath3k_table);
4747#define USB_REQ_DFU_DNLOAD 1
4848#define BULK_SIZE 4096
4949
50- struct ath3k_data {
51- struct usb_device * udev ;
52- u8 * fw_data ;
53- u32 fw_size ;
54- u32 fw_sent ;
55- };
56-
57- static int ath3k_load_firmware (struct ath3k_data * data ,
58- unsigned char * firmware ,
59- int count )
50+ static int ath3k_load_firmware (struct usb_device * udev ,
51+ const struct firmware * firmware )
6052{
6153 u8 * send_buf ;
6254 int err , pipe , len , size , sent = 0 ;
55+ int count = firmware -> size ;
6356
64- BT_DBG ("ath3k %p udev %p" , data , data -> udev );
57+ BT_DBG ("udev %p" , udev );
6558
66- pipe = usb_sndctrlpipe (data -> udev , 0 );
59+ pipe = usb_sndctrlpipe (udev , 0 );
6760
68- if ((usb_control_msg (data -> udev , pipe ,
61+ send_buf = kmalloc (BULK_SIZE , GFP_ATOMIC );
62+ if (!send_buf ) {
63+ BT_ERR ("Can't allocate memory chunk for firmware" );
64+ return - ENOMEM ;
65+ }
66+
67+ memcpy (send_buf , firmware -> data , 20 );
68+ if ((err = usb_control_msg (udev , pipe ,
6969 USB_REQ_DFU_DNLOAD ,
7070 USB_TYPE_VENDOR , 0 , 0 ,
71- firmware , 20 , USB_CTRL_SET_TIMEOUT )) < 0 ) {
71+ send_buf , 20 , USB_CTRL_SET_TIMEOUT )) < 0 ) {
7272 BT_ERR ("Can't change to loading configuration err" );
73- return - EBUSY ;
73+ goto error ;
7474 }
7575 sent += 20 ;
7676 count -= 20 ;
7777
78- send_buf = kmalloc (BULK_SIZE , GFP_ATOMIC );
79- if (!send_buf ) {
80- BT_ERR ("Can't allocate memory chunk for firmware" );
81- return - ENOMEM ;
82- }
83-
8478 while (count ) {
8579 size = min_t (uint , count , BULK_SIZE );
86- pipe = usb_sndbulkpipe (data -> udev , 0x02 );
87- memcpy (send_buf , firmware + sent , size );
80+ pipe = usb_sndbulkpipe (udev , 0x02 );
81+ memcpy (send_buf , firmware -> data + sent , size );
8882
89- err = usb_bulk_msg (data -> udev , pipe , send_buf , size ,
83+ err = usb_bulk_msg (udev , pipe , send_buf , size ,
9084 & len , 3000 );
9185
9286 if (err || (len != size )) {
@@ -112,57 +106,28 @@ static int ath3k_probe(struct usb_interface *intf,
112106{
113107 const struct firmware * firmware ;
114108 struct usb_device * udev = interface_to_usbdev (intf );
115- struct ath3k_data * data ;
116- int size ;
117109
118110 BT_DBG ("intf %p id %p" , intf , id );
119111
120112 if (intf -> cur_altsetting -> desc .bInterfaceNumber != 0 )
121113 return - ENODEV ;
122114
123- data = kzalloc (sizeof (* data ), GFP_KERNEL );
124- if (!data )
125- return - ENOMEM ;
126-
127- data -> udev = udev ;
128-
129115 if (request_firmware (& firmware , "ath3k-1.fw" , & udev -> dev ) < 0 ) {
130- kfree (data );
131116 return - EIO ;
132117 }
133118
134- size = max_t (uint , firmware -> size , 4096 );
135- data -> fw_data = kmalloc (size , GFP_KERNEL );
136- if (!data -> fw_data ) {
119+ if (ath3k_load_firmware (udev , firmware )) {
137120 release_firmware (firmware );
138- kfree (data );
139- return - ENOMEM ;
140- }
141-
142- memcpy (data -> fw_data , firmware -> data , firmware -> size );
143- data -> fw_size = firmware -> size ;
144- data -> fw_sent = 0 ;
145- release_firmware (firmware );
146-
147- usb_set_intfdata (intf , data );
148- if (ath3k_load_firmware (data , data -> fw_data , data -> fw_size )) {
149- usb_set_intfdata (intf , NULL );
150- kfree (data -> fw_data );
151- kfree (data );
152121 return - EIO ;
153122 }
123+ release_firmware (firmware );
154124
155125 return 0 ;
156126}
157127
158128static void ath3k_disconnect (struct usb_interface * intf )
159129{
160- struct ath3k_data * data = usb_get_intfdata (intf );
161-
162130 BT_DBG ("ath3k_disconnect intf %p" , intf );
163-
164- kfree (data -> fw_data );
165- kfree (data );
166131}
167132
168133static struct usb_driver ath3k_driver = {
0 commit comments