On Fri, 2020-10-16 at 12:04 +0530, Srinivasan Raju wrote: > This introduces the pureLiFi LiFi driver for LiFi-X, LiFi-XC > and LiFi-XL USB devices. Suggested neatening patch on top of this: o Use include "usb.h" instead of direct extern o Prefix purelifi to speed and send_packet_from_data_queue functions to remove generic global function naming o Use enum instead of macro defines for MODULATION_RATE_<foo> o Simplify the (mac->chip->)usb->tx. uses with a temporary o Use continue in loops instead of extra indentation o Remove unnecessary %hx printf formatting, use %x --- drivers/net/wireless/purelifi/chip.c | 4 +- drivers/net/wireless/purelifi/mac.c | 60 +++++++++++-------------- drivers/net/wireless/purelifi/mac.h | 22 ++++----- drivers/net/wireless/purelifi/usb.c | 86 ++++++++++++++++-------------------- drivers/net/wireless/purelifi/usb.h | 4 +- 5 files changed, 80 insertions(+), 96 deletions(-) diff --git a/drivers/net/wireless/purelifi/chip.c b/drivers/net/wireless/purelifi/chip.c index 9ad2664b7542..cca03697cb06 100644 --- a/drivers/net/wireless/purelifi/chip.c +++ b/drivers/net/wireless/purelifi/chip.c @@ -42,12 +42,12 @@ int purelifi_chip_init_hw(struct purelifi_chip *chip) u8 *addr = purelifi_mac_get_perm_addr(purelifi_chip_to_mac(chip)); struct usb_device *udev = interface_to_usbdev(chip->usb.intf); - pr_info("purelifi chip %02hx:%02hx v%02hx %02x-%02x-%02x %s\n", + pr_info("purelifi chip %02x:%02x v%02x %02x-%02x-%02x %s\n", le16_to_cpu(udev->descriptor.idVendor), le16_to_cpu(udev->descriptor.idProduct), le16_to_cpu(udev->descriptor.bcdDevice), addr[0], addr[1], addr[2], - speed(udev->speed)); + purelifi_speed(udev->speed)); return purelifi_set_beacon_interval(chip, 100, 0, 0); } diff --git a/drivers/net/wireless/purelifi/mac.c b/drivers/net/wireless/purelifi/mac.c index 6920a1dfd599..09b7c2c0050d 100644 --- a/drivers/net/wireless/purelifi/mac.c +++ b/drivers/net/wireless/purelifi/mac.c @@ -10,6 +10,7 @@ #include "chip.h" #include "mac.h" +#include "usb.h" #ifndef IEEE80211_BAND_2GHZ #define IEEE80211_BAND_2GHZ NL80211_BAND_2GHZ @@ -332,7 +333,6 @@ static int fill_ctrlset(struct purelifi_mac *mac, struct sk_buff *skb) return 0; } -extern void send_packet_from_data_queue(struct purelifi_usb *usb); /** * purelifi_op_tx - transmits a network frame to the device * @@ -366,16 +366,15 @@ static void purelifi_op_tx(struct ieee80211_hw *hw, u8 dst_mac[ETH_ALEN]; u8 sidx; bool found = false; + struct purelifi_usb_tx *tx = &usb->tx; memcpy(dst_mac, &skb->data[28], ETH_ALEN); for (sidx = 0; sidx < MAX_STA_NUM; sidx++) { - if (usb->tx.station[sidx].flag & - STATION_CONNECTED_FLAG) { - if (!memcmp(usb->tx.station[sidx].mac, - dst_mac, ETH_ALEN)) { - found = true; - break; - } + if (!(tx->station[sidx].flag & STATION_CONNECTED_FLAG)) + continue; + if (!memcmp(tx->station[sidx].mac, dst_mac, ETH_ALEN)) { + found = true; + break; } } @@ -384,13 +383,13 @@ static void purelifi_op_tx(struct ieee80211_hw *hw, sidx = STA_BROADCAST_INDEX; /* Stop OS from sending packets, if the queue is half full */ - if (skb_queue_len(&usb->tx.station[sidx].data_list) > 60) - block_queue(usb, usb->tx.station[sidx].mac, true); + if (skb_queue_len(&tx->station[sidx].data_list) > 60) + block_queue(usb, tx->station[sidx].mac, true); /* Schedule packet for transmission if queue is not full */ - if (skb_queue_len(&usb->tx.station[sidx].data_list) < 256) { - skb_queue_tail(&usb->tx.station[sidx].data_list, skb); - send_packet_from_data_queue(usb); + if (skb_queue_len(&tx->station[sidx].data_list) < 256) { + skb_queue_tail(&tx->station[sidx].data_list, skb); + purelifi_send_packet_from_data_queue(usb); } else { dev_kfree_skb(skb); } @@ -487,6 +486,7 @@ int purelifi_mac_rx(struct ieee80211_hw *hw, const u8 *buffer, static unsigned short int min_exp_seq_nmb; u32 crc_error_cnt_low, crc_error_cnt_high; int sidx; + struct purelifi_usb_tx *tx; /* Packet blockade during disabled interface. */ if (!mac->vif) @@ -530,33 +530,25 @@ int purelifi_mac_rx(struct ieee80211_hw *hw, const u8 *buffer, fc = get_unaligned((__le16 *)buffer); need_padding = ieee80211_is_data_qos(fc) ^ ieee80211_has_a4(fc); + tx = &mac->chip.usb.tx; + for (sidx = 0; sidx < MAX_STA_NUM - 1; sidx++) { - if (!memcmp(&buffer[10], - mac->chip.usb.tx.station[sidx].mac, - ETH_ALEN)) { - if (mac->chip.usb.tx.station[sidx].flag & - STATION_CONNECTED_FLAG) { - mac->chip.usb.tx.station[sidx].flag |= - STATION_HEARTBEAT_FLAG; - break; - } + if (memcmp(&buffer[10], tx->station[sidx].mac, ETH_ALEN)) + continue; + if (tx->station[sidx].flag & STATION_CONNECTED_FLAG) { + tx->station[sidx].flag |= STATION_HEARTBEAT_FLAG; + break; } } if (sidx == MAX_STA_NUM - 1) { for (sidx = 0; sidx < MAX_STA_NUM - 1; sidx++) { - if (!(mac->chip.usb.tx.station[sidx].flag & - STATION_CONNECTED_FLAG - )) { - memcpy(mac->chip.usb.tx.station[sidx].mac, - &buffer[10], - ETH_ALEN); - mac->chip.usb.tx.station[sidx].flag |= - STATION_CONNECTED_FLAG; - mac->chip.usb.tx.station[sidx].flag |= - STATION_HEARTBEAT_FLAG; - break; - } + if (tx->station[sidx].flag & STATION_CONNECTED_FLAG) + continue; + memcpy(tx->station[sidx].mac, &buffer[10], ETH_ALEN); + tx->station[sidx].flag |= STATION_CONNECTED_FLAG; + tx->station[sidx].flag |= STATION_HEARTBEAT_FLAG; + break; } } diff --git a/drivers/net/wireless/purelifi/mac.h b/drivers/net/wireless/purelifi/mac.h index 35e28cc4dffb..cca1e70a6416 100644 --- a/drivers/net/wireless/purelifi/mac.h +++ b/drivers/net/wireless/purelifi/mac.h @@ -37,16 +37,18 @@ #define PURELIFI_RX_ERROR 0x80 #define PURELIFI_RX_CRC32_ERROR 0x10 -#define MODULATION_RATE_BPSK_1_2 0 -#define MODULATION_RATE_BPSK_3_4 (MODULATION_RATE_BPSK_1_2 + 1) -#define MODULATION_RATE_QPSK_1_2 (MODULATION_RATE_BPSK_3_4 + 1) -#define MODULATION_RATE_QPSK_3_4 (MODULATION_RATE_QPSK_1_2 + 1) -#define MODULATION_RATE_QAM16_1_2 (MODULATION_RATE_QPSK_3_4 + 1) -#define MODULATION_RATE_QAM16_3_4 (MODULATION_RATE_QAM16_1_2 + 1) -#define MODULATION_RATE_QAM64_1_2 (MODULATION_RATE_QAM16_3_4 + 1) -#define MODULATION_RATE_QAM64_3_4 (MODULATION_RATE_QAM64_1_2 + 1) -#define MODULATION_RATE_AUTO (MODULATION_RATE_QAM64_3_4 + 1) -#define MODULATION_RATE_NUM (MODULATION_RATE_AUTO + 1) +enum { + MODULATION_RATE_BPSK_1_2 = 0, + MODULATION_RATE_BPSK_3_4, + MODULATION_RATE_QPSK_1_2, + MODULATION_RATE_QPSK_3_4, + MODULATION_RATE_QAM16_1_2, + MODULATION_RATE_QAM16_3_4, + MODULATION_RATE_QAM64_1_2, + MODULATION_RATE_QAM64_3_4, + MODULATION_RATE_AUTO, + MODULATION_RATE_NUM +}; #define purelifi_mac_dev(mac) (purelifi_chip_dev(&(mac)->chip)) diff --git a/drivers/net/wireless/purelifi/usb.c b/drivers/net/wireless/purelifi/usb.c index 730adbf786da..1354c8734d44 100644 --- a/drivers/net/wireless/purelifi/usb.c +++ b/drivers/net/wireless/purelifi/usb.c @@ -71,38 +71,32 @@ static inline u16 get_bcd_device(const struct usb_device *udev) #define urb_dev(urb) (&(urb)->dev->dev) -void send_packet_from_data_queue(struct purelifi_usb *usb) +void purelifi_send_packet_from_data_queue(struct purelifi_usb *usb) { struct sk_buff *skb = NULL; unsigned long flags; static u8 sidx; u8 last_served_sidx; + struct purelifi_usb_tx *tx = &usb->tx; - spin_lock_irqsave(&usb->tx.lock, flags); + spin_lock_irqsave(&tx->lock, flags); last_served_sidx = sidx; do { sidx = (sidx + 1) % MAX_STA_NUM; - if ((usb->tx.station[sidx].flag & - STATION_CONNECTED_FLAG)) { - if (!(usb->tx.station[sidx].flag & - STATION_FIFO_FULL_FLAG)) { - skb = skb_peek(&usb->tx.station - [sidx].data_list); - } - } + if (!tx->station[sidx].flag & STATION_CONNECTED_FLAG) + continue; + if (!(tx->station[sidx].flag & STATION_FIFO_FULL_FLAG)) + skb = skb_peek(&tx->station[sidx].data_list); } while ((sidx != last_served_sidx) && (!skb)); if (skb) { - skb = skb_dequeue(&usb->tx.station[sidx].data_list); + skb = skb_dequeue(&tx->station[sidx].data_list); usb_write_req_async(usb, skb->data, skb->len, USB_REQ_DATA_TX, tx_urb_complete, skb); - if (skb_queue_len(&usb->tx.station[sidx].data_list) - <= 60) { - block_queue(usb, usb->tx.station[sidx].mac, - false); - } + if (skb_queue_len(&tx->station[sidx].data_list) <= 60) + block_queue(usb, tx->station[sidx].mac, false); } - spin_unlock_irqrestore(&usb->tx.lock, flags); + spin_unlock_irqrestore(&tx->lock, flags); } static void handle_rx_packet(struct purelifi_usb *usb, const u8 *buffer, @@ -179,18 +173,16 @@ static void rx_urb_complete(struct urb *urb) dev_info(&usb->intf->dev, "FIFO full not packet receipt\n"); tx->mac_fifo_full = 1; - for (sidx = 0; sidx < MAX_STA_NUM; sidx++) { - usb->tx.station[sidx].flag |= - STATION_FIFO_FULL_FLAG; - } + for (sidx = 0; sidx < MAX_STA_NUM; sidx++) + tx->station[sidx].flag |= STATION_FIFO_FULL_FLAG; break; case STATION_FIFO_ALMOST_FULL_MESSAGE: dev_info(&usb->intf->dev, "FIFO full packet receipt\n"); for (sidx = 0; sidx < MAX_STA_NUM; sidx++) - usb->tx.station[sidx].flag &= 0xFD; + tx->station[sidx].flag &= 0xFD; - send_packet_from_data_queue(usb); + purelifi_send_packet_from_data_queue(usb); break; case STATION_CONNECT_MESSAGE: fpga_link_connection_f = 1; @@ -435,7 +427,7 @@ void tx_urb_complete(struct urb *urb) } purelifi_mac_tx_to_dev(skb, urb->status); - send_packet_from_data_queue(usb); + purelifi_send_packet_from_data_queue(usb); usb_free_urb(urb); } @@ -537,7 +529,7 @@ void purelifi_usb_release(struct purelifi_usb *usb) /* FIXME: usb_interrupt, usb_tx, usb_rx? */ } -const char *speed(enum usb_device_speed speed) +const char *purelifi_speed(enum usb_device_speed speed) { switch (speed) { case USB_SPEED_LOW: @@ -1050,7 +1042,7 @@ static void slif_data_plane_sap_timer_callb(struct timer_list *t) { struct purelifi_usb *usb = from_timer(usb, t, tx.tx_retry_timer); - send_packet_from_data_queue(usb); + purelifi_send_packet_from_data_queue(usb); usb->tx.tx_retry_timer.expires = jiffies + TX_RETRY_BACKOFF_JIFF; timer_setup(&usb->tx.tx_retry_timer, slif_data_plane_sap_timer_callb, 0); @@ -1060,19 +1052,17 @@ static void slif_data_plane_sap_timer_callb(struct timer_list *t) static void sta_queue_cleanup_timer_callb(struct timer_list *t) { struct purelifi_usb *usb = from_timer(usb, t, sta_queue_cleanup); + struct purelifi_usb_tx *tx = &usb->tx; int sidx; for (sidx = 0; sidx < MAX_STA_NUM - 1; sidx++) { - if (usb->tx.station[sidx].flag & STATION_CONNECTED_FLAG) { - if (usb->tx.station[sidx].flag & - STATION_HEARTBEAT_FLAG) { - usb->tx.station[sidx].flag ^= - STATION_HEARTBEAT_FLAG; - } else { - memset(usb->tx.station[sidx].mac, 0, - ETH_ALEN); - usb->tx.station[sidx].flag = 0; - } + if (!(tx->station[sidx].flag & STATION_CONNECTED_FLAG)) + continue; + if (tx->station[sidx].flag & STATION_HEARTBEAT_FLAG) { + tx->station[sidx].flag ^= STATION_HEARTBEAT_FLAG; + } else { + memset(tx->station[sidx].mac, 0, ETH_ALEN); + tx->station[sidx].flag = 0; } } usb->sta_queue_cleanup.expires = jiffies + STA_QUEUE_CLEANUP_JIFF; @@ -1231,8 +1221,9 @@ static int probe(struct usb_interface *intf, const struct usb_device_id *id) { int r = 0; - struct purelifi_usb *usb; struct purelifi_chip *chip; + struct purelifi_usb *usb; + struct purelifi_usb_tx *tx; struct ieee80211_hw *hw = NULL; static unsigned char hw_address[ETH_ALEN]; static unsigned char serial_number[256]; @@ -1250,6 +1241,7 @@ static int probe(struct usb_interface *intf, chip = &purelifi_hw_mac(hw)->chip; usb = &chip->usb; + tx = &usb->tx; r = upload_mac_and_serial_number(intf, hw_address, serial_number); if (r) { @@ -1284,8 +1276,8 @@ static int probe(struct usb_interface *intf, goto error; } - usb->tx.mac_fifo_full = 0; - spin_lock_init(&usb->tx.lock); + tx->mac_fifo_full = 0; + spin_lock_init(&tx->lock); msleep(200); r = purelifi_usb_init_hw(usb); @@ -1320,19 +1312,17 @@ static int probe(struct usb_interface *intf, /* Initialise the data plane Tx queue */ atomic_set(&data_queue_flag, 1); for (i = 0; i < MAX_STA_NUM; i++) { - skb_queue_head_init(&usb->tx.station[i].data_list); - usb->tx.station[i].flag = 0; + skb_queue_head_init(&tx->station[i].data_list); + tx->station[i].flag = 0; } - usb->tx.station[STA_BROADCAST_INDEX].flag |= - STATION_CONNECTED_FLAG; + tx->station[STA_BROADCAST_INDEX].flag |= STATION_CONNECTED_FLAG; for (i = 0; i < ETH_ALEN; i++) - usb->tx.station[STA_BROADCAST_INDEX].mac[i] = 0xFF; + tx->station[STA_BROADCAST_INDEX].mac[i] = 0xFF; atomic_set(&data_queue_flag, 0); - timer_setup(&usb->tx.tx_retry_timer, - slif_data_plane_sap_timer_callb, 0); - usb->tx.tx_retry_timer.expires = jiffies + TX_RETRY_BACKOFF_JIFF; - add_timer(&usb->tx.tx_retry_timer); + timer_setup(&tx->tx_retry_timer, slif_data_plane_sap_timer_callb, 0); + tx->tx_retry_timer.expires = jiffies + TX_RETRY_BACKOFF_JIFF; + add_timer(&tx->tx_retry_timer); timer_setup(&usb->sta_queue_cleanup, sta_queue_cleanup_timer_callb, 0); diff --git a/drivers/net/wireless/purelifi/usb.h b/drivers/net/wireless/purelifi/usb.h index cc8f67cd7ad0..af37e7e9fa0a 100644 --- a/drivers/net/wireless/purelifi/usb.h +++ b/drivers/net/wireless/purelifi/usb.h @@ -136,7 +136,7 @@ static inline struct ieee80211_hw *purelifi_usb_to_hw(struct purelifi_usb void purelifi_usb_init(struct purelifi_usb *usb, struct ieee80211_hw *hw, struct usb_interface *intf); -void send_packet_from_data_queue(struct purelifi_usb *usb); +void purelifi_send_packet_from_data_queue(struct purelifi_usb *usb); void purelifi_usb_release(struct purelifi_usb *usb); void purelifi_usb_disable_rx(struct purelifi_usb *usb); void purelifi_usb_enable_tx(struct purelifi_usb *usb); @@ -144,5 +144,5 @@ void purelifi_usb_disable_tx(struct purelifi_usb *usb); int purelifi_usb_tx(struct purelifi_usb *usb, struct sk_buff *skb); int purelifi_usb_enable_rx(struct purelifi_usb *usb); int purelifi_usb_init_hw(struct purelifi_usb *usb); -const char *speed(enum usb_device_speed speed); +const char *purelifi_speed(enum usb_device_speed speed); #endif