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