cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

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);