usb.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2021 pureLiFi
  4. */
  5. #include <linux/kernel.h>
  6. #include <linux/init.h>
  7. #include <linux/device.h>
  8. #include <linux/errno.h>
  9. #include <linux/slab.h>
  10. #include <linux/skbuff.h>
  11. #include <linux/usb.h>
  12. #include <linux/workqueue.h>
  13. #include <linux/proc_fs.h>
  14. #include <linux/fs.h>
  15. #include <linux/string.h>
  16. #include <linux/module.h>
  17. #include <net/mac80211.h>
  18. #include <asm/unaligned.h>
  19. #include <linux/sysfs.h>
  20. #include "mac.h"
  21. #include "usb.h"
  22. #include "chip.h"
  23. static const struct usb_device_id usb_ids[] = {
  24. { USB_DEVICE(PURELIFI_X_VENDOR_ID_0, PURELIFI_X_PRODUCT_ID_0),
  25. .driver_info = DEVICE_LIFI_X },
  26. { USB_DEVICE(PURELIFI_XC_VENDOR_ID_0, PURELIFI_XC_PRODUCT_ID_0),
  27. .driver_info = DEVICE_LIFI_XC },
  28. { USB_DEVICE(PURELIFI_XL_VENDOR_ID_0, PURELIFI_XL_PRODUCT_ID_0),
  29. .driver_info = DEVICE_LIFI_XL },
  30. {}
  31. };
  32. void plfxlc_send_packet_from_data_queue(struct plfxlc_usb *usb)
  33. {
  34. struct plfxlc_usb_tx *tx = &usb->tx;
  35. struct sk_buff *skb = NULL;
  36. unsigned long flags;
  37. u8 last_served_sidx;
  38. spin_lock_irqsave(&tx->lock, flags);
  39. last_served_sidx = usb->sidx;
  40. do {
  41. usb->sidx = (usb->sidx + 1) % MAX_STA_NUM;
  42. if (!(tx->station[usb->sidx].flag & STATION_CONNECTED_FLAG))
  43. continue;
  44. if (!(tx->station[usb->sidx].flag & STATION_FIFO_FULL_FLAG))
  45. skb = skb_peek(&tx->station[usb->sidx].data_list);
  46. } while ((usb->sidx != last_served_sidx) && (!skb));
  47. if (skb) {
  48. skb = skb_dequeue(&tx->station[usb->sidx].data_list);
  49. plfxlc_usb_wreq_async(usb, skb->data, skb->len, USB_REQ_DATA_TX,
  50. plfxlc_tx_urb_complete, skb);
  51. if (skb_queue_len(&tx->station[usb->sidx].data_list) <= 60)
  52. ieee80211_wake_queues(plfxlc_usb_to_hw(usb));
  53. }
  54. spin_unlock_irqrestore(&tx->lock, flags);
  55. }
  56. static void handle_rx_packet(struct plfxlc_usb *usb, const u8 *buffer,
  57. unsigned int length)
  58. {
  59. plfxlc_mac_rx(plfxlc_usb_to_hw(usb), buffer, length);
  60. }
  61. static void rx_urb_complete(struct urb *urb)
  62. {
  63. struct plfxlc_usb_tx *tx;
  64. struct plfxlc_usb *usb;
  65. unsigned int length;
  66. const u8 *buffer;
  67. u16 status;
  68. u8 sidx;
  69. int r;
  70. if (!urb) {
  71. pr_err("urb is NULL\n");
  72. return;
  73. }
  74. if (!urb->context) {
  75. pr_err("urb ctx is NULL\n");
  76. return;
  77. }
  78. usb = urb->context;
  79. if (usb->initialized != 1) {
  80. pr_err("usb is not initialized\n");
  81. return;
  82. }
  83. tx = &usb->tx;
  84. switch (urb->status) {
  85. case 0:
  86. break;
  87. case -ESHUTDOWN:
  88. case -EINVAL:
  89. case -ENODEV:
  90. case -ENOENT:
  91. case -ECONNRESET:
  92. case -EPIPE:
  93. dev_dbg(plfxlc_urb_dev(urb), "urb %p error %d\n", urb, urb->status);
  94. return;
  95. default:
  96. dev_dbg(plfxlc_urb_dev(urb), "urb %p error %d\n", urb, urb->status);
  97. if (tx->submitted_urbs++ < PURELIFI_URB_RETRY_MAX) {
  98. dev_dbg(plfxlc_urb_dev(urb), "urb %p resubmit %d", urb,
  99. tx->submitted_urbs++);
  100. goto resubmit;
  101. } else {
  102. dev_dbg(plfxlc_urb_dev(urb), "urb %p max resubmits reached", urb);
  103. tx->submitted_urbs = 0;
  104. return;
  105. }
  106. }
  107. buffer = urb->transfer_buffer;
  108. length = le32_to_cpu(*(__le32 *)(buffer + sizeof(struct rx_status)))
  109. + sizeof(u32);
  110. if (urb->actual_length != (PLF_MSG_STATUS_OFFSET + 1)) {
  111. if (usb->initialized && usb->link_up)
  112. handle_rx_packet(usb, buffer, length);
  113. goto resubmit;
  114. }
  115. status = buffer[PLF_MSG_STATUS_OFFSET];
  116. switch (status) {
  117. case STATION_FIFO_ALMOST_FULL_NOT_MESSAGE:
  118. dev_dbg(&usb->intf->dev,
  119. "FIFO full not packet receipt\n");
  120. tx->mac_fifo_full = 1;
  121. for (sidx = 0; sidx < MAX_STA_NUM; sidx++)
  122. tx->station[sidx].flag |= STATION_FIFO_FULL_FLAG;
  123. break;
  124. case STATION_FIFO_ALMOST_FULL_MESSAGE:
  125. dev_dbg(&usb->intf->dev, "FIFO full packet receipt\n");
  126. for (sidx = 0; sidx < MAX_STA_NUM; sidx++)
  127. tx->station[sidx].flag &= STATION_ACTIVE_FLAG;
  128. plfxlc_send_packet_from_data_queue(usb);
  129. break;
  130. case STATION_CONNECT_MESSAGE:
  131. usb->link_up = 1;
  132. dev_dbg(&usb->intf->dev, "ST_CONNECT_MSG packet receipt\n");
  133. break;
  134. case STATION_DISCONNECT_MESSAGE:
  135. usb->link_up = 0;
  136. dev_dbg(&usb->intf->dev, "ST_DISCONN_MSG packet receipt\n");
  137. break;
  138. default:
  139. dev_dbg(&usb->intf->dev, "Unknown packet receipt\n");
  140. break;
  141. }
  142. resubmit:
  143. r = usb_submit_urb(urb, GFP_ATOMIC);
  144. if (r)
  145. dev_dbg(plfxlc_urb_dev(urb), "urb %p resubmit fail (%d)\n", urb, r);
  146. }
  147. static struct urb *alloc_rx_urb(struct plfxlc_usb *usb)
  148. {
  149. struct usb_device *udev = plfxlc_usb_to_usbdev(usb);
  150. struct urb *urb;
  151. void *buffer;
  152. urb = usb_alloc_urb(0, GFP_KERNEL);
  153. if (!urb)
  154. return NULL;
  155. buffer = usb_alloc_coherent(udev, USB_MAX_RX_SIZE, GFP_KERNEL,
  156. &urb->transfer_dma);
  157. if (!buffer) {
  158. usb_free_urb(urb);
  159. return NULL;
  160. }
  161. usb_fill_bulk_urb(urb, udev, usb_rcvbulkpipe(udev, EP_DATA_IN),
  162. buffer, USB_MAX_RX_SIZE,
  163. rx_urb_complete, usb);
  164. urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
  165. return urb;
  166. }
  167. static void free_rx_urb(struct urb *urb)
  168. {
  169. if (!urb)
  170. return;
  171. usb_free_coherent(urb->dev, urb->transfer_buffer_length,
  172. urb->transfer_buffer, urb->transfer_dma);
  173. usb_free_urb(urb);
  174. }
  175. static int __lf_x_usb_enable_rx(struct plfxlc_usb *usb)
  176. {
  177. struct plfxlc_usb_rx *rx = &usb->rx;
  178. struct urb **urbs;
  179. int i, r;
  180. r = -ENOMEM;
  181. urbs = kcalloc(RX_URBS_COUNT, sizeof(struct urb *), GFP_KERNEL);
  182. if (!urbs)
  183. goto error;
  184. for (i = 0; i < RX_URBS_COUNT; i++) {
  185. urbs[i] = alloc_rx_urb(usb);
  186. if (!urbs[i])
  187. goto error;
  188. }
  189. spin_lock_irq(&rx->lock);
  190. dev_dbg(plfxlc_usb_dev(usb), "irq_disabled %d\n", irqs_disabled());
  191. if (rx->urbs) {
  192. spin_unlock_irq(&rx->lock);
  193. r = 0;
  194. goto error;
  195. }
  196. rx->urbs = urbs;
  197. rx->urbs_count = RX_URBS_COUNT;
  198. spin_unlock_irq(&rx->lock);
  199. for (i = 0; i < RX_URBS_COUNT; i++) {
  200. r = usb_submit_urb(urbs[i], GFP_KERNEL);
  201. if (r)
  202. goto error_submit;
  203. }
  204. return 0;
  205. error_submit:
  206. for (i = 0; i < RX_URBS_COUNT; i++)
  207. usb_kill_urb(urbs[i]);
  208. spin_lock_irq(&rx->lock);
  209. rx->urbs = NULL;
  210. rx->urbs_count = 0;
  211. spin_unlock_irq(&rx->lock);
  212. error:
  213. if (urbs) {
  214. for (i = 0; i < RX_URBS_COUNT; i++)
  215. free_rx_urb(urbs[i]);
  216. }
  217. kfree(urbs);
  218. return r;
  219. }
  220. int plfxlc_usb_enable_rx(struct plfxlc_usb *usb)
  221. {
  222. struct plfxlc_usb_rx *rx = &usb->rx;
  223. int r;
  224. mutex_lock(&rx->setup_mutex);
  225. r = __lf_x_usb_enable_rx(usb);
  226. if (!r)
  227. usb->rx_usb_enabled = 1;
  228. mutex_unlock(&rx->setup_mutex);
  229. return r;
  230. }
  231. static void __lf_x_usb_disable_rx(struct plfxlc_usb *usb)
  232. {
  233. struct plfxlc_usb_rx *rx = &usb->rx;
  234. unsigned long flags;
  235. unsigned int count;
  236. struct urb **urbs;
  237. int i;
  238. spin_lock_irqsave(&rx->lock, flags);
  239. urbs = rx->urbs;
  240. count = rx->urbs_count;
  241. spin_unlock_irqrestore(&rx->lock, flags);
  242. if (!urbs)
  243. return;
  244. for (i = 0; i < count; i++) {
  245. usb_kill_urb(urbs[i]);
  246. free_rx_urb(urbs[i]);
  247. }
  248. kfree(urbs);
  249. rx->urbs = NULL;
  250. rx->urbs_count = 0;
  251. }
  252. void plfxlc_usb_disable_rx(struct plfxlc_usb *usb)
  253. {
  254. struct plfxlc_usb_rx *rx = &usb->rx;
  255. mutex_lock(&rx->setup_mutex);
  256. __lf_x_usb_disable_rx(usb);
  257. usb->rx_usb_enabled = 0;
  258. mutex_unlock(&rx->setup_mutex);
  259. }
  260. void plfxlc_usb_disable_tx(struct plfxlc_usb *usb)
  261. {
  262. struct plfxlc_usb_tx *tx = &usb->tx;
  263. unsigned long flags;
  264. clear_bit(PLF_BIT_ENABLED, &tx->enabled);
  265. /* kill all submitted tx-urbs */
  266. usb_kill_anchored_urbs(&tx->submitted);
  267. spin_lock_irqsave(&tx->lock, flags);
  268. WARN_ON(!skb_queue_empty(&tx->submitted_skbs));
  269. WARN_ON(tx->submitted_urbs != 0);
  270. tx->submitted_urbs = 0;
  271. spin_unlock_irqrestore(&tx->lock, flags);
  272. /* The stopped state is ignored, relying on ieee80211_wake_queues()
  273. * in a potentionally following plfxlc_usb_enable_tx().
  274. */
  275. }
  276. void plfxlc_usb_enable_tx(struct plfxlc_usb *usb)
  277. {
  278. struct plfxlc_usb_tx *tx = &usb->tx;
  279. unsigned long flags;
  280. spin_lock_irqsave(&tx->lock, flags);
  281. set_bit(PLF_BIT_ENABLED, &tx->enabled);
  282. tx->submitted_urbs = 0;
  283. ieee80211_wake_queues(plfxlc_usb_to_hw(usb));
  284. tx->stopped = 0;
  285. spin_unlock_irqrestore(&tx->lock, flags);
  286. }
  287. void plfxlc_tx_urb_complete(struct urb *urb)
  288. {
  289. struct ieee80211_tx_info *info;
  290. struct plfxlc_usb *usb;
  291. struct sk_buff *skb;
  292. skb = urb->context;
  293. info = IEEE80211_SKB_CB(skb);
  294. /* grab 'usb' pointer before handing off the skb (since
  295. * it might be freed by plfxlc_mac_tx_to_dev or mac80211)
  296. */
  297. usb = &plfxlc_hw_mac(info->rate_driver_data[0])->chip.usb;
  298. switch (urb->status) {
  299. case 0:
  300. break;
  301. case -ESHUTDOWN:
  302. case -EINVAL:
  303. case -ENODEV:
  304. case -ENOENT:
  305. case -ECONNRESET:
  306. case -EPIPE:
  307. dev_dbg(plfxlc_urb_dev(urb), "urb %p error %d\n", urb, urb->status);
  308. break;
  309. default:
  310. dev_dbg(plfxlc_urb_dev(urb), "urb %p error %d\n", urb, urb->status);
  311. return;
  312. }
  313. plfxlc_mac_tx_to_dev(skb, urb->status);
  314. plfxlc_send_packet_from_data_queue(usb);
  315. usb_free_urb(urb);
  316. }
  317. static inline void init_usb_rx(struct plfxlc_usb *usb)
  318. {
  319. struct plfxlc_usb_rx *rx = &usb->rx;
  320. spin_lock_init(&rx->lock);
  321. mutex_init(&rx->setup_mutex);
  322. if (interface_to_usbdev(usb->intf)->speed == USB_SPEED_HIGH)
  323. rx->usb_packet_size = 512;
  324. else
  325. rx->usb_packet_size = 64;
  326. if (rx->fragment_length != 0)
  327. dev_dbg(plfxlc_usb_dev(usb), "fragment_length error\n");
  328. }
  329. static inline void init_usb_tx(struct plfxlc_usb *usb)
  330. {
  331. struct plfxlc_usb_tx *tx = &usb->tx;
  332. spin_lock_init(&tx->lock);
  333. clear_bit(PLF_BIT_ENABLED, &tx->enabled);
  334. tx->stopped = 0;
  335. skb_queue_head_init(&tx->submitted_skbs);
  336. init_usb_anchor(&tx->submitted);
  337. }
  338. void plfxlc_usb_init(struct plfxlc_usb *usb, struct ieee80211_hw *hw,
  339. struct usb_interface *intf)
  340. {
  341. memset(usb, 0, sizeof(*usb));
  342. usb->intf = usb_get_intf(intf);
  343. usb_set_intfdata(usb->intf, hw);
  344. init_usb_tx(usb);
  345. init_usb_rx(usb);
  346. }
  347. void plfxlc_usb_release(struct plfxlc_usb *usb)
  348. {
  349. plfxlc_op_stop(plfxlc_usb_to_hw(usb));
  350. plfxlc_usb_disable_tx(usb);
  351. plfxlc_usb_disable_rx(usb);
  352. usb_set_intfdata(usb->intf, NULL);
  353. usb_put_intf(usb->intf);
  354. }
  355. const char *plfxlc_speed(enum usb_device_speed speed)
  356. {
  357. switch (speed) {
  358. case USB_SPEED_LOW:
  359. return "low";
  360. case USB_SPEED_FULL:
  361. return "full";
  362. case USB_SPEED_HIGH:
  363. return "high";
  364. default:
  365. return "unknown";
  366. }
  367. }
  368. int plfxlc_usb_init_hw(struct plfxlc_usb *usb)
  369. {
  370. int r;
  371. r = usb_reset_configuration(plfxlc_usb_to_usbdev(usb));
  372. if (r) {
  373. dev_err(plfxlc_usb_dev(usb), "cfg reset failed (%d)\n", r);
  374. return r;
  375. }
  376. return 0;
  377. }
  378. static void get_usb_req(struct usb_device *udev, void *buffer,
  379. u32 buffer_len, enum plf_usb_req_enum usb_req_id,
  380. struct plf_usb_req *usb_req)
  381. {
  382. __be32 payload_len_nw = cpu_to_be32(buffer_len + FCS_LEN);
  383. const u8 *buffer_src_p = buffer;
  384. u8 *buffer_dst = usb_req->buf;
  385. u32 temp_usb_len = 0;
  386. usb_req->id = cpu_to_be32(usb_req_id);
  387. usb_req->len = cpu_to_be32(0);
  388. /* Copy buffer length into the transmitted buffer, as it is important
  389. * for the Rx MAC to know its exact length.
  390. */
  391. if (usb_req->id == cpu_to_be32(USB_REQ_BEACON_WR)) {
  392. memcpy(buffer_dst, &payload_len_nw, sizeof(payload_len_nw));
  393. buffer_dst += sizeof(payload_len_nw);
  394. temp_usb_len += sizeof(payload_len_nw);
  395. }
  396. memcpy(buffer_dst, buffer_src_p, buffer_len);
  397. buffer_dst += buffer_len;
  398. buffer_src_p += buffer_len;
  399. temp_usb_len += buffer_len;
  400. /* Set the FCS_LEN (4) bytes as 0 for CRC checking. */
  401. memset(buffer_dst, 0, FCS_LEN);
  402. buffer_dst += FCS_LEN;
  403. temp_usb_len += FCS_LEN;
  404. /* Round the packet to be transmitted to 4 bytes. */
  405. if (temp_usb_len % PURELIFI_BYTE_NUM_ALIGNMENT) {
  406. memset(buffer_dst, 0, PURELIFI_BYTE_NUM_ALIGNMENT -
  407. (temp_usb_len %
  408. PURELIFI_BYTE_NUM_ALIGNMENT));
  409. buffer_dst += PURELIFI_BYTE_NUM_ALIGNMENT -
  410. (temp_usb_len %
  411. PURELIFI_BYTE_NUM_ALIGNMENT);
  412. temp_usb_len += PURELIFI_BYTE_NUM_ALIGNMENT -
  413. (temp_usb_len % PURELIFI_BYTE_NUM_ALIGNMENT);
  414. }
  415. usb_req->len = cpu_to_be32(temp_usb_len);
  416. }
  417. int plfxlc_usb_wreq_async(struct plfxlc_usb *usb, const u8 *buffer,
  418. int buffer_len, enum plf_usb_req_enum usb_req_id,
  419. usb_complete_t complete_fn,
  420. void *context)
  421. {
  422. struct usb_device *udev = interface_to_usbdev(usb->ez_usb);
  423. struct urb *urb = usb_alloc_urb(0, GFP_ATOMIC);
  424. int r;
  425. usb_fill_bulk_urb(urb, udev, usb_sndbulkpipe(udev, EP_DATA_OUT),
  426. (void *)buffer, buffer_len, complete_fn, context);
  427. r = usb_submit_urb(urb, GFP_ATOMIC);
  428. if (r)
  429. dev_err(&udev->dev, "Async write submit failed (%d)\n", r);
  430. return r;
  431. }
  432. int plfxlc_usb_wreq(struct usb_interface *ez_usb, void *buffer, int buffer_len,
  433. enum plf_usb_req_enum usb_req_id)
  434. {
  435. struct usb_device *udev = interface_to_usbdev(ez_usb);
  436. unsigned char *dma_buffer = NULL;
  437. struct plf_usb_req usb_req;
  438. int usb_bulk_msg_len;
  439. int actual_length;
  440. int r;
  441. get_usb_req(udev, buffer, buffer_len, usb_req_id, &usb_req);
  442. usb_bulk_msg_len = sizeof(__le32) + sizeof(__le32) +
  443. be32_to_cpu(usb_req.len);
  444. dma_buffer = kmemdup(&usb_req, usb_bulk_msg_len, GFP_KERNEL);
  445. if (!dma_buffer) {
  446. r = -ENOMEM;
  447. goto error;
  448. }
  449. r = usb_bulk_msg(udev,
  450. usb_sndbulkpipe(udev, EP_DATA_OUT),
  451. dma_buffer, usb_bulk_msg_len,
  452. &actual_length, USB_BULK_MSG_TIMEOUT_MS);
  453. kfree(dma_buffer);
  454. error:
  455. if (r) {
  456. r = -ENOMEM;
  457. dev_err(&udev->dev, "usb_bulk_msg failed (%d)\n", r);
  458. }
  459. return r;
  460. }
  461. static void slif_data_plane_sap_timer_callb(struct timer_list *t)
  462. {
  463. struct plfxlc_usb *usb = from_timer(usb, t, tx.tx_retry_timer);
  464. plfxlc_send_packet_from_data_queue(usb);
  465. timer_setup(&usb->tx.tx_retry_timer,
  466. slif_data_plane_sap_timer_callb, 0);
  467. mod_timer(&usb->tx.tx_retry_timer, jiffies + TX_RETRY_BACKOFF_JIFF);
  468. }
  469. static void sta_queue_cleanup_timer_callb(struct timer_list *t)
  470. {
  471. struct plfxlc_usb *usb = from_timer(usb, t, sta_queue_cleanup);
  472. struct plfxlc_usb_tx *tx = &usb->tx;
  473. int sidx;
  474. for (sidx = 0; sidx < MAX_STA_NUM - 1; sidx++) {
  475. if (!(tx->station[sidx].flag & STATION_CONNECTED_FLAG))
  476. continue;
  477. if (tx->station[sidx].flag & STATION_HEARTBEAT_FLAG) {
  478. tx->station[sidx].flag ^= STATION_HEARTBEAT_FLAG;
  479. } else {
  480. eth_zero_addr(tx->station[sidx].mac);
  481. tx->station[sidx].flag = 0;
  482. }
  483. }
  484. timer_setup(&usb->sta_queue_cleanup,
  485. sta_queue_cleanup_timer_callb, 0);
  486. mod_timer(&usb->sta_queue_cleanup, jiffies + STA_QUEUE_CLEANUP_JIFF);
  487. }
  488. static int probe(struct usb_interface *intf,
  489. const struct usb_device_id *id)
  490. {
  491. u8 serial_number[PURELIFI_SERIAL_LEN];
  492. struct ieee80211_hw *hw = NULL;
  493. struct plfxlc_usb_tx *tx;
  494. struct plfxlc_chip *chip;
  495. struct plfxlc_usb *usb;
  496. u8 hw_address[ETH_ALEN];
  497. unsigned int i;
  498. int r = 0;
  499. hw = plfxlc_mac_alloc_hw(intf);
  500. if (!hw) {
  501. r = -ENOMEM;
  502. goto error;
  503. }
  504. chip = &plfxlc_hw_mac(hw)->chip;
  505. usb = &chip->usb;
  506. usb->ez_usb = intf;
  507. tx = &usb->tx;
  508. r = plfxlc_upload_mac_and_serial(intf, hw_address, serial_number);
  509. if (r) {
  510. dev_err(&intf->dev, "MAC and Serial upload failed (%d)\n", r);
  511. goto error;
  512. }
  513. chip->unit_type = STA;
  514. dev_err(&intf->dev, "Unit type is station");
  515. r = plfxlc_mac_preinit_hw(hw, hw_address);
  516. if (r) {
  517. dev_err(&intf->dev, "Init mac failed (%d)\n", r);
  518. goto error;
  519. }
  520. r = ieee80211_register_hw(hw);
  521. if (r) {
  522. dev_err(&intf->dev, "Register device failed (%d)\n", r);
  523. goto error;
  524. }
  525. if ((le16_to_cpu(interface_to_usbdev(intf)->descriptor.idVendor) ==
  526. PURELIFI_XL_VENDOR_ID_0) &&
  527. (le16_to_cpu(interface_to_usbdev(intf)->descriptor.idProduct) ==
  528. PURELIFI_XL_PRODUCT_ID_0)) {
  529. r = plfxlc_download_xl_firmware(intf);
  530. } else {
  531. r = plfxlc_download_fpga(intf);
  532. }
  533. if (r != 0) {
  534. dev_err(&intf->dev, "FPGA download failed (%d)\n", r);
  535. goto error;
  536. }
  537. tx->mac_fifo_full = 0;
  538. spin_lock_init(&tx->lock);
  539. msleep(PLF_MSLEEP_TIME);
  540. r = plfxlc_usb_init_hw(usb);
  541. if (r < 0) {
  542. dev_err(&intf->dev, "usb_init_hw failed (%d)\n", r);
  543. goto error;
  544. }
  545. msleep(PLF_MSLEEP_TIME);
  546. r = plfxlc_chip_switch_radio(chip, PLFXLC_RADIO_ON);
  547. if (r < 0) {
  548. dev_dbg(&intf->dev, "chip_switch_radio_on failed (%d)\n", r);
  549. goto error;
  550. }
  551. msleep(PLF_MSLEEP_TIME);
  552. r = plfxlc_chip_set_rate(chip, 8);
  553. if (r < 0) {
  554. dev_dbg(&intf->dev, "chip_set_rate failed (%d)\n", r);
  555. goto error;
  556. }
  557. msleep(PLF_MSLEEP_TIME);
  558. r = plfxlc_usb_wreq(usb->ez_usb,
  559. hw_address, ETH_ALEN, USB_REQ_MAC_WR);
  560. if (r < 0) {
  561. dev_dbg(&intf->dev, "MAC_WR failure (%d)\n", r);
  562. goto error;
  563. }
  564. plfxlc_chip_enable_rxtx(chip);
  565. /* Initialise the data plane Tx queue */
  566. for (i = 0; i < MAX_STA_NUM; i++) {
  567. skb_queue_head_init(&tx->station[i].data_list);
  568. tx->station[i].flag = 0;
  569. }
  570. tx->station[STA_BROADCAST_INDEX].flag |= STATION_CONNECTED_FLAG;
  571. for (i = 0; i < ETH_ALEN; i++)
  572. tx->station[STA_BROADCAST_INDEX].mac[i] = 0xFF;
  573. timer_setup(&tx->tx_retry_timer, slif_data_plane_sap_timer_callb, 0);
  574. tx->tx_retry_timer.expires = jiffies + TX_RETRY_BACKOFF_JIFF;
  575. add_timer(&tx->tx_retry_timer);
  576. timer_setup(&usb->sta_queue_cleanup,
  577. sta_queue_cleanup_timer_callb, 0);
  578. usb->sta_queue_cleanup.expires = jiffies + STA_QUEUE_CLEANUP_JIFF;
  579. add_timer(&usb->sta_queue_cleanup);
  580. plfxlc_mac_init_hw(hw);
  581. usb->initialized = true;
  582. return 0;
  583. error:
  584. if (hw) {
  585. plfxlc_mac_release(plfxlc_hw_mac(hw));
  586. ieee80211_unregister_hw(hw);
  587. ieee80211_free_hw(hw);
  588. }
  589. dev_err(&intf->dev, "pureLifi:Device error");
  590. return r;
  591. }
  592. static void disconnect(struct usb_interface *intf)
  593. {
  594. struct ieee80211_hw *hw = plfxlc_intf_to_hw(intf);
  595. struct plfxlc_mac *mac;
  596. struct plfxlc_usb *usb;
  597. /* Either something really bad happened, or
  598. * we're just dealing with a DEVICE_INSTALLER.
  599. */
  600. if (!hw)
  601. return;
  602. mac = plfxlc_hw_mac(hw);
  603. usb = &mac->chip.usb;
  604. del_timer_sync(&usb->tx.tx_retry_timer);
  605. del_timer_sync(&usb->sta_queue_cleanup);
  606. ieee80211_unregister_hw(hw);
  607. plfxlc_chip_disable_rxtx(&mac->chip);
  608. /* If the disconnect has been caused by a removal of the
  609. * driver module, the reset allows reloading of the driver. If the
  610. * reset will not be executed here, the upload of the firmware in the
  611. * probe function caused by the reloading of the driver will fail.
  612. */
  613. usb_reset_device(interface_to_usbdev(intf));
  614. plfxlc_mac_release(mac);
  615. ieee80211_free_hw(hw);
  616. }
  617. static void plfxlc_usb_resume(struct plfxlc_usb *usb)
  618. {
  619. struct plfxlc_mac *mac = plfxlc_usb_to_mac(usb);
  620. int r;
  621. r = plfxlc_op_start(plfxlc_usb_to_hw(usb));
  622. if (r < 0) {
  623. dev_warn(plfxlc_usb_dev(usb),
  624. "Device resume failed (%d)\n", r);
  625. if (usb->was_running)
  626. set_bit(PURELIFI_DEVICE_RUNNING, &mac->flags);
  627. usb_queue_reset_device(usb->intf);
  628. return;
  629. }
  630. if (mac->type != NL80211_IFTYPE_UNSPECIFIED) {
  631. r = plfxlc_restore_settings(mac);
  632. if (r < 0) {
  633. dev_dbg(plfxlc_usb_dev(usb),
  634. "Restore failed (%d)\n", r);
  635. return;
  636. }
  637. }
  638. }
  639. static void plfxlc_usb_stop(struct plfxlc_usb *usb)
  640. {
  641. plfxlc_op_stop(plfxlc_usb_to_hw(usb));
  642. plfxlc_usb_disable_tx(usb);
  643. plfxlc_usb_disable_rx(usb);
  644. usb->initialized = false;
  645. }
  646. static int pre_reset(struct usb_interface *intf)
  647. {
  648. struct ieee80211_hw *hw = usb_get_intfdata(intf);
  649. struct plfxlc_mac *mac;
  650. struct plfxlc_usb *usb;
  651. if (!hw || intf->condition != USB_INTERFACE_BOUND)
  652. return 0;
  653. mac = plfxlc_hw_mac(hw);
  654. usb = &mac->chip.usb;
  655. usb->was_running = test_bit(PURELIFI_DEVICE_RUNNING, &mac->flags);
  656. plfxlc_usb_stop(usb);
  657. return 0;
  658. }
  659. static int post_reset(struct usb_interface *intf)
  660. {
  661. struct ieee80211_hw *hw = usb_get_intfdata(intf);
  662. struct plfxlc_mac *mac;
  663. struct plfxlc_usb *usb;
  664. if (!hw || intf->condition != USB_INTERFACE_BOUND)
  665. return 0;
  666. mac = plfxlc_hw_mac(hw);
  667. usb = &mac->chip.usb;
  668. if (usb->was_running)
  669. plfxlc_usb_resume(usb);
  670. return 0;
  671. }
  672. #ifdef CONFIG_PM
  673. static struct plfxlc_usb *get_plfxlc_usb(struct usb_interface *intf)
  674. {
  675. struct ieee80211_hw *hw = plfxlc_intf_to_hw(intf);
  676. struct plfxlc_mac *mac;
  677. /* Either something really bad happened, or
  678. * we're just dealing with a DEVICE_INSTALLER.
  679. */
  680. if (!hw)
  681. return NULL;
  682. mac = plfxlc_hw_mac(hw);
  683. return &mac->chip.usb;
  684. }
  685. static int suspend(struct usb_interface *interface,
  686. pm_message_t message)
  687. {
  688. struct plfxlc_usb *pl = get_plfxlc_usb(interface);
  689. struct plfxlc_mac *mac = plfxlc_usb_to_mac(pl);
  690. if (!pl)
  691. return -ENODEV;
  692. if (pl->initialized == 0)
  693. return 0;
  694. pl->was_running = test_bit(PURELIFI_DEVICE_RUNNING, &mac->flags);
  695. plfxlc_usb_stop(pl);
  696. return 0;
  697. }
  698. static int resume(struct usb_interface *interface)
  699. {
  700. struct plfxlc_usb *pl = get_plfxlc_usb(interface);
  701. if (!pl)
  702. return -ENODEV;
  703. if (pl->was_running)
  704. plfxlc_usb_resume(pl);
  705. return 0;
  706. }
  707. #endif
  708. static struct usb_driver driver = {
  709. .name = KBUILD_MODNAME,
  710. .id_table = usb_ids,
  711. .probe = probe,
  712. .disconnect = disconnect,
  713. .pre_reset = pre_reset,
  714. .post_reset = post_reset,
  715. #ifdef CONFIG_PM
  716. .suspend = suspend,
  717. .resume = resume,
  718. #endif
  719. .disable_hub_initiated_lpm = 1,
  720. };
  721. static int __init usb_init(void)
  722. {
  723. int r;
  724. r = usb_register(&driver);
  725. if (r) {
  726. pr_err("%s usb_register() failed %d\n", driver.name, r);
  727. return r;
  728. }
  729. pr_debug("Driver initialized :%s\n", driver.name);
  730. return 0;
  731. }
  732. static void __exit usb_exit(void)
  733. {
  734. usb_deregister(&driver);
  735. pr_debug("%s %s\n", driver.name, __func__);
  736. }
  737. MODULE_LICENSE("GPL");
  738. MODULE_DESCRIPTION("USB driver for pureLiFi devices");
  739. MODULE_AUTHOR("pureLiFi");
  740. MODULE_VERSION("1.0");
  741. MODULE_FIRMWARE("plfxlc/lifi-x.bin");
  742. MODULE_DEVICE_TABLE(usb, usb_ids);
  743. module_init(usb_init);
  744. module_exit(usb_exit);