1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2012 - 2018 Microchip Technology Inc., and its subsidiaries.
7 #include <linux/if_ether.h>
9 #include <net/dsfield.h>
13 #define WAKE_UP_TRIAL_RETRY 10000
15 static void wilc_wlan_txq_remove(struct wilc *wilc, u8 q_num,
16 struct txq_entry_t *tqe)
19 wilc->txq_entries -= 1;
20 wilc->txq[q_num].count--;
23 static struct txq_entry_t *
24 wilc_wlan_txq_remove_from_head(struct wilc *wilc, u8 q_num)
26 struct txq_entry_t *tqe = NULL;
29 spin_lock_irqsave(&wilc->txq_spinlock, flags);
31 if (!list_empty(&wilc->txq[q_num].txq_head.list)) {
32 tqe = list_first_entry(&wilc->txq[q_num].txq_head.list,
33 struct txq_entry_t, list);
35 wilc->txq_entries -= 1;
36 wilc->txq[q_num].count--;
38 spin_unlock_irqrestore(&wilc->txq_spinlock, flags);
42 static void wilc_wlan_txq_add_to_tail(struct net_device *dev, u8 q_num,
43 struct txq_entry_t *tqe)
46 struct wilc_vif *vif = netdev_priv(dev);
47 struct wilc *wilc = vif->wilc;
49 spin_lock_irqsave(&wilc->txq_spinlock, flags);
51 list_add_tail(&tqe->list, &wilc->txq[q_num].txq_head.list);
52 wilc->txq_entries += 1;
53 wilc->txq[q_num].count++;
55 spin_unlock_irqrestore(&wilc->txq_spinlock, flags);
57 complete(&wilc->txq_event);
60 static void wilc_wlan_txq_add_to_head(struct wilc_vif *vif, u8 q_num,
61 struct txq_entry_t *tqe)
64 struct wilc *wilc = vif->wilc;
66 mutex_lock(&wilc->txq_add_to_head_cs);
68 spin_lock_irqsave(&wilc->txq_spinlock, flags);
70 list_add(&tqe->list, &wilc->txq[q_num].txq_head.list);
71 wilc->txq_entries += 1;
72 wilc->txq[q_num].count++;
74 spin_unlock_irqrestore(&wilc->txq_spinlock, flags);
75 mutex_unlock(&wilc->txq_add_to_head_cs);
76 complete(&wilc->txq_event);
79 #define NOT_TCP_ACK (-1)
81 static inline void add_tcp_session(struct wilc_vif *vif, u32 src_prt,
84 struct tcp_ack_filter *f = &vif->ack_filter;
86 if (f->tcp_session < 2 * MAX_TCP_SESSION) {
87 f->ack_session_info[f->tcp_session].seq_num = seq;
88 f->ack_session_info[f->tcp_session].bigger_ack_num = 0;
89 f->ack_session_info[f->tcp_session].src_port = src_prt;
90 f->ack_session_info[f->tcp_session].dst_port = dst_prt;
95 static inline void update_tcp_session(struct wilc_vif *vif, u32 index, u32 ack)
97 struct tcp_ack_filter *f = &vif->ack_filter;
99 if (index < 2 * MAX_TCP_SESSION &&
100 ack > f->ack_session_info[index].bigger_ack_num)
101 f->ack_session_info[index].bigger_ack_num = ack;
104 static inline void add_tcp_pending_ack(struct wilc_vif *vif, u32 ack,
106 struct txq_entry_t *txqe)
108 struct tcp_ack_filter *f = &vif->ack_filter;
109 u32 i = f->pending_base + f->pending_acks_idx;
111 if (i < MAX_PENDING_ACKS) {
112 f->pending_acks[i].ack_num = ack;
113 f->pending_acks[i].txqe = txqe;
114 f->pending_acks[i].session_index = session_index;
116 f->pending_acks_idx++;
120 static inline void tcp_process(struct net_device *dev, struct txq_entry_t *tqe)
122 void *buffer = tqe->buffer;
123 const struct ethhdr *eth_hdr_ptr = buffer;
126 struct wilc_vif *vif = netdev_priv(dev);
127 struct wilc *wilc = vif->wilc;
128 struct tcp_ack_filter *f = &vif->ack_filter;
129 const struct iphdr *ip_hdr_ptr;
130 const struct tcphdr *tcp_hdr_ptr;
131 u32 ihl, total_length, data_offset;
133 spin_lock_irqsave(&wilc->txq_spinlock, flags);
135 if (eth_hdr_ptr->h_proto != htons(ETH_P_IP))
138 ip_hdr_ptr = buffer + ETH_HLEN;
140 if (ip_hdr_ptr->protocol != IPPROTO_TCP)
143 ihl = ip_hdr_ptr->ihl << 2;
144 tcp_hdr_ptr = buffer + ETH_HLEN + ihl;
145 total_length = ntohs(ip_hdr_ptr->tot_len);
147 data_offset = tcp_hdr_ptr->doff << 2;
148 if (total_length == (ihl + data_offset)) {
151 seq_no = ntohl(tcp_hdr_ptr->seq);
152 ack_no = ntohl(tcp_hdr_ptr->ack_seq);
153 for (i = 0; i < f->tcp_session; i++) {
154 u32 j = f->ack_session_info[i].seq_num;
156 if (i < 2 * MAX_TCP_SESSION &&
158 update_tcp_session(vif, i, ack_no);
162 if (i == f->tcp_session)
163 add_tcp_session(vif, 0, 0, seq_no);
165 add_tcp_pending_ack(vif, ack_no, i, tqe);
169 spin_unlock_irqrestore(&wilc->txq_spinlock, flags);
172 static void wilc_wlan_txq_filter_dup_tcp_ack(struct net_device *dev)
174 struct wilc_vif *vif = netdev_priv(dev);
175 struct wilc *wilc = vif->wilc;
176 struct tcp_ack_filter *f = &vif->ack_filter;
181 spin_lock_irqsave(&wilc->txq_spinlock, flags);
182 for (i = f->pending_base;
183 i < (f->pending_base + f->pending_acks_idx); i++) {
187 if (i >= MAX_PENDING_ACKS)
190 index = f->pending_acks[i].session_index;
192 if (index >= 2 * MAX_TCP_SESSION)
195 bigger_ack_num = f->ack_session_info[index].bigger_ack_num;
197 if (f->pending_acks[i].ack_num < bigger_ack_num) {
198 struct txq_entry_t *tqe;
200 tqe = f->pending_acks[i].txqe;
202 wilc_wlan_txq_remove(wilc, tqe->q_num, tqe);
204 if (tqe->tx_complete_func)
205 tqe->tx_complete_func(tqe->priv,
212 f->pending_acks_idx = 0;
215 if (f->pending_base == 0)
216 f->pending_base = MAX_TCP_SESSION;
220 spin_unlock_irqrestore(&wilc->txq_spinlock, flags);
222 while (dropped > 0) {
223 wait_for_completion_timeout(&wilc->txq_event,
224 msecs_to_jiffies(1));
229 void wilc_enable_tcp_ack_filter(struct wilc_vif *vif, bool value)
231 vif->ack_filter.enabled = value;
234 static int wilc_wlan_txq_add_cfg_pkt(struct wilc_vif *vif, u8 *buffer,
237 struct txq_entry_t *tqe;
238 struct wilc *wilc = vif->wilc;
240 netdev_dbg(vif->ndev, "Adding config packet ...\n");
242 netdev_dbg(vif->ndev, "Return due to clear function\n");
243 complete(&wilc->cfg_event);
247 tqe = kmalloc(sizeof(*tqe), GFP_ATOMIC);
249 complete(&wilc->cfg_event);
253 tqe->type = WILC_CFG_PKT;
254 tqe->buffer = buffer;
255 tqe->buffer_size = buffer_size;
256 tqe->tx_complete_func = NULL;
258 tqe->q_num = AC_VO_Q;
259 tqe->ack_idx = NOT_TCP_ACK;
262 wilc_wlan_txq_add_to_head(vif, AC_VO_Q, tqe);
267 static bool is_ac_q_limit(struct wilc *wl, u8 q_num)
269 u8 factors[NQUEUES] = {1, 1, 1, 1};
272 struct wilc_tx_queue_status *q = &wl->tx_q_limit;
277 spin_lock_irqsave(&wl->txq_spinlock, flags);
278 if (!q->initialized) {
279 for (i = 0; i < AC_BUFFER_SIZE; i++)
280 q->buffer[i] = i % NQUEUES;
282 for (i = 0; i < NQUEUES; i++) {
283 q->cnt[i] = AC_BUFFER_SIZE * factors[i] / NQUEUES;
286 q->end_index = AC_BUFFER_SIZE - 1;
290 end_index = q->end_index;
291 q->cnt[q->buffer[end_index]] -= factors[q->buffer[end_index]];
292 q->cnt[q_num] += factors[q_num];
293 q->sum += (factors[q_num] - factors[q->buffer[end_index]]);
295 q->buffer[end_index] = q_num;
299 q->end_index = AC_BUFFER_SIZE - 1;
304 q_limit = (q->cnt[q_num] * FLOW_CONTROL_UPPER_THRESHOLD / q->sum) + 1;
306 if (wl->txq[q_num].count <= q_limit)
309 spin_unlock_irqrestore(&wl->txq_spinlock, flags);
314 static inline u8 ac_classify(struct wilc *wilc, struct sk_buff *skb)
319 switch (skb->protocol) {
320 case htons(ETH_P_IP):
321 dscp = ipv4_get_dsfield(ip_hdr(skb)) & 0xfc;
323 case htons(ETH_P_IPV6):
324 dscp = ipv6_get_dsfield(ipv6_hdr(skb)) & 0xfc;
353 static inline int ac_balance(struct wilc *wl, u8 *ratio)
360 for (i = 0; i < NQUEUES; i++)
361 if (wl->txq[i].fw.count > max_count)
362 max_count = wl->txq[i].fw.count;
364 for (i = 0; i < NQUEUES; i++)
365 ratio[i] = max_count - wl->txq[i].fw.count;
370 static inline void ac_update_fw_ac_pkt_info(struct wilc *wl, u32 reg)
372 wl->txq[AC_BK_Q].fw.count = FIELD_GET(BK_AC_COUNT_FIELD, reg);
373 wl->txq[AC_BE_Q].fw.count = FIELD_GET(BE_AC_COUNT_FIELD, reg);
374 wl->txq[AC_VI_Q].fw.count = FIELD_GET(VI_AC_COUNT_FIELD, reg);
375 wl->txq[AC_VO_Q].fw.count = FIELD_GET(VO_AC_COUNT_FIELD, reg);
377 wl->txq[AC_BK_Q].fw.acm = FIELD_GET(BK_AC_ACM_STAT_FIELD, reg);
378 wl->txq[AC_BE_Q].fw.acm = FIELD_GET(BE_AC_ACM_STAT_FIELD, reg);
379 wl->txq[AC_VI_Q].fw.acm = FIELD_GET(VI_AC_ACM_STAT_FIELD, reg);
380 wl->txq[AC_VO_Q].fw.acm = FIELD_GET(VO_AC_ACM_STAT_FIELD, reg);
383 static inline u8 ac_change(struct wilc *wilc, u8 *ac)
386 if (wilc->txq[*ac].fw.acm == 0)
389 } while (*ac < NQUEUES);
394 int wilc_wlan_txq_add_net_pkt(struct net_device *dev,
395 struct tx_complete_data *tx_data, u8 *buffer,
397 void (*tx_complete_fn)(void *, int))
399 struct txq_entry_t *tqe;
400 struct wilc_vif *vif = netdev_priv(dev);
407 tx_complete_fn(tx_data, 0);
411 if (!wilc->initialized) {
412 tx_complete_fn(tx_data, 0);
416 tqe = kmalloc(sizeof(*tqe), GFP_ATOMIC);
419 tx_complete_fn(tx_data, 0);
422 tqe->type = WILC_NET_PKT;
423 tqe->buffer = buffer;
424 tqe->buffer_size = buffer_size;
425 tqe->tx_complete_func = tx_complete_fn;
429 q_num = ac_classify(wilc, tx_data->skb);
431 if (ac_change(wilc, &q_num)) {
432 tx_complete_fn(tx_data, 0);
437 if (is_ac_q_limit(wilc, q_num)) {
438 tqe->ack_idx = NOT_TCP_ACK;
439 if (vif->ack_filter.enabled)
440 tcp_process(dev, tqe);
441 wilc_wlan_txq_add_to_tail(dev, q_num, tqe);
443 tx_complete_fn(tx_data, 0);
447 return wilc->txq_entries;
450 int wilc_wlan_txq_add_mgmt_pkt(struct net_device *dev, void *priv, u8 *buffer,
452 void (*tx_complete_fn)(void *, int))
454 struct txq_entry_t *tqe;
455 struct wilc_vif *vif = netdev_priv(dev);
461 tx_complete_fn(priv, 0);
465 if (!wilc->initialized) {
466 tx_complete_fn(priv, 0);
469 tqe = kmalloc(sizeof(*tqe), GFP_ATOMIC);
472 tx_complete_fn(priv, 0);
475 tqe->type = WILC_MGMT_PKT;
476 tqe->buffer = buffer;
477 tqe->buffer_size = buffer_size;
478 tqe->tx_complete_func = tx_complete_fn;
480 tqe->q_num = AC_BE_Q;
481 tqe->ack_idx = NOT_TCP_ACK;
483 wilc_wlan_txq_add_to_tail(dev, AC_VO_Q, tqe);
487 static struct txq_entry_t *wilc_wlan_txq_get_first(struct wilc *wilc, u8 q_num)
489 struct txq_entry_t *tqe = NULL;
492 spin_lock_irqsave(&wilc->txq_spinlock, flags);
494 if (!list_empty(&wilc->txq[q_num].txq_head.list))
495 tqe = list_first_entry(&wilc->txq[q_num].txq_head.list,
496 struct txq_entry_t, list);
498 spin_unlock_irqrestore(&wilc->txq_spinlock, flags);
503 static struct txq_entry_t *wilc_wlan_txq_get_next(struct wilc *wilc,
504 struct txq_entry_t *tqe,
509 spin_lock_irqsave(&wilc->txq_spinlock, flags);
511 if (!list_is_last(&tqe->list, &wilc->txq[q_num].txq_head.list))
512 tqe = list_next_entry(tqe, list);
515 spin_unlock_irqrestore(&wilc->txq_spinlock, flags);
520 static void wilc_wlan_rxq_add(struct wilc *wilc, struct rxq_entry_t *rqe)
525 mutex_lock(&wilc->rxq_cs);
526 list_add_tail(&rqe->list, &wilc->rxq_head.list);
527 mutex_unlock(&wilc->rxq_cs);
530 static struct rxq_entry_t *wilc_wlan_rxq_remove(struct wilc *wilc)
532 struct rxq_entry_t *rqe = NULL;
534 mutex_lock(&wilc->rxq_cs);
535 if (!list_empty(&wilc->rxq_head.list)) {
536 rqe = list_first_entry(&wilc->rxq_head.list, struct rxq_entry_t,
538 list_del(&rqe->list);
540 mutex_unlock(&wilc->rxq_cs);
544 static int chip_allow_sleep_wilc1000(struct wilc *wilc)
547 const struct wilc_hif_func *hif_func = wilc->hif_func;
548 u32 wakeup_reg, wakeup_bit;
549 u32 to_host_from_fw_reg, to_host_from_fw_bit;
550 u32 from_host_to_fw_reg, from_host_to_fw_bit;
554 if (wilc->io_type == WILC_HIF_SDIO) {
555 wakeup_reg = WILC_SDIO_WAKEUP_REG;
556 wakeup_bit = WILC_SDIO_WAKEUP_BIT;
557 from_host_to_fw_reg = WILC_SDIO_HOST_TO_FW_REG;
558 from_host_to_fw_bit = WILC_SDIO_HOST_TO_FW_BIT;
559 to_host_from_fw_reg = WILC_SDIO_FW_TO_HOST_REG;
560 to_host_from_fw_bit = WILC_SDIO_FW_TO_HOST_BIT;
562 wakeup_reg = WILC_SPI_WAKEUP_REG;
563 wakeup_bit = WILC_SPI_WAKEUP_BIT;
564 from_host_to_fw_reg = WILC_SPI_HOST_TO_FW_REG;
565 from_host_to_fw_bit = WILC_SPI_HOST_TO_FW_BIT;
566 to_host_from_fw_reg = WILC_SPI_FW_TO_HOST_REG;
567 to_host_from_fw_bit = WILC_SPI_FW_TO_HOST_BIT;
571 ret = hif_func->hif_read_reg(wilc, to_host_from_fw_reg, ®);
574 if ((reg & to_host_from_fw_bit) == 0)
578 pr_warn("FW not responding\n");
581 ret = hif_func->hif_read_reg(wilc, wakeup_reg, ®);
584 if (reg & wakeup_bit) {
586 ret = hif_func->hif_write_reg(wilc, wakeup_reg, reg);
591 ret = hif_func->hif_read_reg(wilc, from_host_to_fw_reg, ®);
594 if (reg & from_host_to_fw_bit) {
595 reg &= ~from_host_to_fw_bit;
596 ret = hif_func->hif_write_reg(wilc, from_host_to_fw_reg, reg);
604 static int chip_allow_sleep_wilc3000(struct wilc *wilc)
608 const struct wilc_hif_func *hif_func = wilc->hif_func;
610 if (wilc->io_type == WILC_HIF_SDIO) {
611 ret = hif_func->hif_read_reg(wilc, WILC_SDIO_WAKEUP_REG, ®);
614 ret = hif_func->hif_write_reg(wilc, WILC_SDIO_WAKEUP_REG,
615 reg & ~WILC_SDIO_WAKEUP_BIT);
619 ret = hif_func->hif_read_reg(wilc, WILC_SPI_WAKEUP_REG, ®);
622 ret = hif_func->hif_write_reg(wilc, WILC_SPI_WAKEUP_REG,
623 reg & ~WILC_SPI_WAKEUP_BIT);
630 static int chip_allow_sleep(struct wilc *wilc)
632 if (is_wilc1000(wilc->chipid))
633 return chip_allow_sleep_wilc1000(wilc);
635 return chip_allow_sleep_wilc3000(wilc);
638 static int chip_wakeup_wilc1000(struct wilc *wilc)
641 u32 clk_status_val = 0, trials = 0;
642 u32 wakeup_reg, wakeup_bit;
643 u32 clk_status_reg, clk_status_bit;
644 u32 from_host_to_fw_reg, from_host_to_fw_bit;
645 const struct wilc_hif_func *hif_func = wilc->hif_func;
647 if (wilc->io_type == WILC_HIF_SDIO) {
648 wakeup_reg = WILC_SDIO_WAKEUP_REG;
649 wakeup_bit = WILC_SDIO_WAKEUP_BIT;
650 clk_status_reg = WILC1000_SDIO_CLK_STATUS_REG;
651 clk_status_bit = WILC1000_SDIO_CLK_STATUS_BIT;
652 from_host_to_fw_reg = WILC_SDIO_HOST_TO_FW_REG;
653 from_host_to_fw_bit = WILC_SDIO_HOST_TO_FW_BIT;
655 wakeup_reg = WILC_SPI_WAKEUP_REG;
656 wakeup_bit = WILC_SPI_WAKEUP_BIT;
657 clk_status_reg = WILC1000_SPI_CLK_STATUS_REG;
658 clk_status_bit = WILC1000_SPI_CLK_STATUS_BIT;
659 from_host_to_fw_reg = WILC_SPI_HOST_TO_FW_REG;
660 from_host_to_fw_bit = WILC_SPI_HOST_TO_FW_BIT;
663 /* indicate host wakeup */
664 ret = hif_func->hif_write_reg(wilc, from_host_to_fw_reg,
665 from_host_to_fw_bit);
669 /* Set wake-up bit */
670 ret = hif_func->hif_write_reg(wilc, wakeup_reg,
675 while (trials < WAKE_UP_TRIAL_RETRY) {
676 ret = hif_func->hif_read_reg(wilc, clk_status_reg,
679 pr_err("Bus error %d %x\n", ret, clk_status_val);
682 if (clk_status_val & clk_status_bit)
687 if (trials >= WAKE_UP_TRIAL_RETRY) {
688 pr_err("Failed to wake-up the chip\n");
691 /* Sometimes spi fail to read clock regs after reading
692 * writing clockless registers
694 if (wilc->io_type == WILC_HIF_SPI)
695 wilc->hif_func->hif_reset(wilc);
700 static int chip_wakeup_wilc3000(struct wilc *wilc)
702 u32 wakeup_reg_val, clk_status_reg_val, trials = 0;
703 u32 wakeup_reg, wakeup_bit;
704 u32 clk_status_reg, clk_status_bit;
705 int wake_seq_trials = 5;
706 const struct wilc_hif_func *hif_func = wilc->hif_func;
708 if (wilc->io_type == WILC_HIF_SDIO) {
709 wakeup_reg = WILC_SDIO_WAKEUP_REG;
710 wakeup_bit = WILC_SDIO_WAKEUP_BIT;
711 clk_status_reg = WILC3000_SDIO_CLK_STATUS_REG;
712 clk_status_bit = WILC3000_SDIO_CLK_STATUS_BIT;
714 wakeup_reg = WILC_SPI_WAKEUP_REG;
715 wakeup_bit = WILC_SPI_WAKEUP_BIT;
716 clk_status_reg = WILC3000_SPI_CLK_STATUS_REG;
717 clk_status_bit = WILC3000_SPI_CLK_STATUS_BIT;
720 hif_func->hif_read_reg(wilc, wakeup_reg, &wakeup_reg_val);
722 hif_func->hif_write_reg(wilc, wakeup_reg, wakeup_reg_val |
724 /* Check the clock status */
725 hif_func->hif_read_reg(wilc, clk_status_reg,
726 &clk_status_reg_val);
728 /* In case of clocks off, wait 1ms, and check it again.
729 * if still off, wait for another 1ms, for a total wait of 3ms.
730 * If still off, redo the wake up sequence
732 while ((clk_status_reg_val & clk_status_bit) == 0 &&
733 (++trials % 4) != 0) {
734 /* Wait for the chip to stabilize*/
735 usleep_range(1000, 1100);
737 /* Make sure chip is awake. This is an extra step that
738 * can be removed later to avoid the bus access
741 hif_func->hif_read_reg(wilc, clk_status_reg,
742 &clk_status_reg_val);
744 /* in case of failure, Reset the wakeup bit to introduce a new
745 * edge on the next loop
747 if ((clk_status_reg_val & clk_status_bit) == 0) {
748 hif_func->hif_write_reg(wilc, wakeup_reg,
749 wakeup_reg_val & (~wakeup_bit));
750 /* added wait before wakeup sequence retry */
751 usleep_range(200, 300);
753 } while ((clk_status_reg_val & clk_status_bit) == 0 && wake_seq_trials-- > 0);
754 if (!wake_seq_trials)
755 dev_err(wilc->dev, "clocks still OFF. Wake up failed\n");
760 static int chip_wakeup(struct wilc *wilc)
762 if (is_wilc1000(wilc->chipid))
763 return chip_wakeup_wilc1000(wilc);
765 return chip_wakeup_wilc3000(wilc);
768 static inline int acquire_bus(struct wilc *wilc, enum bus_acquire acquire)
772 mutex_lock(&wilc->hif_cs);
773 if (acquire == WILC_BUS_ACQUIRE_AND_WAKEUP && wilc->power_save_mode) {
774 ret = chip_wakeup(wilc);
776 mutex_unlock(&wilc->hif_cs);
782 static inline int release_bus(struct wilc *wilc, enum bus_release release)
786 if (release == WILC_BUS_RELEASE_ALLOW_SLEEP && wilc->power_save_mode)
787 ret = chip_allow_sleep(wilc);
788 mutex_unlock(&wilc->hif_cs);
793 int host_wakeup_notify(struct wilc *wilc)
795 int ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
800 wilc->hif_func->hif_write_reg(wilc, is_wilc1000(wilc->chipid) ?
801 WILC1000_CORTUS_INTERRUPT_2 :
802 WILC3000_CORTUS_INTERRUPT_2, 1);
803 return release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
805 EXPORT_SYMBOL_GPL(host_wakeup_notify);
807 int host_sleep_notify(struct wilc *wilc)
809 int ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
814 wilc->hif_func->hif_write_reg(wilc, is_wilc1000(wilc->chipid) ?
815 WILC1000_CORTUS_INTERRUPT_1 :
816 WILC3000_CORTUS_INTERRUPT_1, 1);
817 return release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
819 EXPORT_SYMBOL_GPL(host_sleep_notify);
821 int wilc_wlan_handle_txq(struct wilc *wilc, u32 *txq_count)
827 u8 ac_desired_ratio[NQUEUES] = {0, 0, 0, 0};
828 u8 ac_preserve_ratio[NQUEUES] = {1, 1, 1, 1};
830 u8 vmm_entries_ac[WILC_VMM_TBL_SIZE];
832 bool max_size_over = 0, ac_exist = 0;
834 struct txq_entry_t *tqe_q[NQUEUES];
838 u32 *vmm_table = wilc->vmm_table;
839 u8 ac_pkt_num_to_chip[NQUEUES] = {0, 0, 0, 0};
840 const struct wilc_hif_func *func;
842 u8 *txb = wilc->tx_buffer;
843 struct wilc_vif *vif;
849 if (ac_balance(wilc, ac_desired_ratio))
852 mutex_lock(&wilc->txq_add_to_head_cs);
854 srcu_idx = srcu_read_lock(&wilc->srcu);
855 wilc_for_each_vif(wilc, vif)
856 wilc_wlan_txq_filter_dup_tcp_ack(vif->ndev);
857 srcu_read_unlock(&wilc->srcu, srcu_idx);
859 for (ac = 0; ac < NQUEUES; ac++)
860 tqe_q[ac] = wilc_wlan_txq_get_first(wilc, ac);
865 num_pkts_to_add = ac_desired_ratio;
868 for (ac = 0; (ac < NQUEUES) && (!max_size_over); ac++) {
873 for (k = 0; (k < num_pkts_to_add[ac]) &&
874 (!max_size_over) && tqe_q[ac]; k++) {
875 if (i >= (WILC_VMM_TBL_SIZE - 1)) {
880 if (tqe_q[ac]->type == WILC_CFG_PKT)
881 vmm_sz = ETH_CONFIG_PKT_HDR_OFFSET;
882 else if (tqe_q[ac]->type == WILC_NET_PKT)
883 vmm_sz = ETH_ETHERNET_HDR_OFFSET;
885 vmm_sz = HOST_HDR_OFFSET;
887 vmm_sz += tqe_q[ac]->buffer_size;
888 vmm_sz = ALIGN(vmm_sz, 4);
890 if ((sum + vmm_sz) > WILC_TX_BUFF_SIZE) {
894 vmm_table[i] = vmm_sz / 4;
895 if (tqe_q[ac]->type == WILC_CFG_PKT)
896 vmm_table[i] |= BIT(10);
898 cpu_to_le32s(&vmm_table[i]);
899 vmm_entries_ac[i] = ac;
903 tqe_q[ac] = wilc_wlan_txq_get_next(wilc,
908 num_pkts_to_add = ac_preserve_ratio;
909 } while (!max_size_over && ac_exist);
915 ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
920 func = wilc->hif_func;
922 ret = func->hif_read_reg(wilc, WILC_HOST_TX_CTRL, ®);
926 if ((reg & 0x1) == 0) {
927 ac_update_fw_ac_pkt_info(wilc, reg);
934 ret = func->hif_write_reg(wilc, WILC_HOST_TX_CTRL, 0);
937 } while (!wilc->quit);
940 goto out_release_bus;
944 ret = func->hif_block_tx(wilc,
945 WILC_VMM_TBL_RX_SHADOW_BASE,
951 if (is_wilc1000(wilc->chipid)) {
952 ret = func->hif_write_reg(wilc, WILC_HOST_VMM_CTL, 0x2);
957 ret = func->hif_read_reg(wilc, WILC_HOST_VMM_CTL, ®);
960 if (FIELD_GET(WILC_VMM_ENTRY_AVAILABLE, reg)) {
961 entries = FIELD_GET(WILC_VMM_ENTRY_COUNT, reg);
966 ret = func->hif_write_reg(wilc, WILC_HOST_VMM_CTL, 0);
970 /* interrupt firmware */
971 ret = func->hif_write_reg(wilc, WILC_CORTUS_INTERRUPT_BASE, 1);
976 ret = func->hif_read_reg(wilc, WILC_CORTUS_INTERRUPT_BASE, ®);
980 /* Get the entries */
981 ret = func->hif_read_reg(wilc, WILC_HOST_VMM_CTL, ®);
985 entries = FIELD_GET(WILC_VMM_ENTRY_COUNT, reg);
991 ret = func->hif_write_reg(wilc, WILC_HOST_VMM_CTL, 0x0);
999 ret = func->hif_read_reg(wilc, WILC_HOST_TX_CTRL, ®);
1003 ret = func->hif_write_reg(wilc, WILC_HOST_TX_CTRL, reg);
1008 goto out_release_bus;
1012 * No VMM space available in firmware so retry to transmit
1013 * the packet from tx queue.
1015 ret = WILC_VMM_ENTRY_FULL_RETRY;
1016 goto out_release_bus;
1019 ret = release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
1026 struct txq_entry_t *tqe;
1027 u32 header, buffer_offset;
1031 if (vmm_table[i] == 0 || vmm_entries_ac[i] >= NQUEUES)
1034 tqe = wilc_wlan_txq_remove_from_head(wilc, vmm_entries_ac[i]);
1038 ac_pkt_num_to_chip[vmm_entries_ac[i]]++;
1041 le32_to_cpus(&vmm_table[i]);
1042 vmm_sz = FIELD_GET(WILC_VMM_BUFFER_SIZE, vmm_table[i]);
1045 if (tqe->type == WILC_MGMT_PKT)
1048 header = (FIELD_PREP(WILC_VMM_HDR_TYPE, tqe->type) |
1049 FIELD_PREP(WILC_VMM_HDR_MGMT_FIELD, mgmt_ptk) |
1050 FIELD_PREP(WILC_VMM_HDR_PKT_SIZE, tqe->buffer_size) |
1051 FIELD_PREP(WILC_VMM_HDR_BUFF_SIZE, vmm_sz));
1053 cpu_to_le32s(&header);
1054 memcpy(&txb[offset], &header, 4);
1055 if (tqe->type == WILC_CFG_PKT) {
1056 buffer_offset = ETH_CONFIG_PKT_HDR_OFFSET;
1057 } else if (tqe->type == WILC_NET_PKT) {
1058 int prio = tqe->q_num;
1060 bssid = tqe->vif->bssid;
1061 buffer_offset = ETH_ETHERNET_HDR_OFFSET;
1062 memcpy(&txb[offset + 4], &prio, sizeof(prio));
1063 memcpy(&txb[offset + 8], bssid, 6);
1065 buffer_offset = HOST_HDR_OFFSET;
1068 memcpy(&txb[offset + buffer_offset],
1069 tqe->buffer, tqe->buffer_size);
1073 if (tqe->tx_complete_func)
1074 tqe->tx_complete_func(tqe->priv, tqe->status);
1075 if (tqe->ack_idx != NOT_TCP_ACK &&
1076 tqe->ack_idx < MAX_PENDING_ACKS)
1077 vif->ack_filter.pending_acks[tqe->ack_idx].txqe = NULL;
1079 } while (--entries);
1080 for (i = 0; i < NQUEUES; i++)
1081 wilc->txq[i].fw.count += ac_pkt_num_to_chip[i];
1083 ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
1087 ret = func->hif_clear_int_ext(wilc, ENABLE_TX_VMM);
1089 goto out_release_bus;
1091 ret = func->hif_block_tx_ext(wilc, 0, txb, offset);
1094 rv = release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
1099 mutex_unlock(&wilc->txq_add_to_head_cs);
1102 *txq_count = wilc->txq_entries;
1106 static void wilc_wlan_handle_rx_buff(struct wilc *wilc, u8 *buffer, int size)
1110 u32 pkt_len, pkt_offset, tp_len;
1115 buff_ptr = buffer + offset;
1116 header = get_unaligned_le32(buff_ptr);
1118 is_cfg_packet = FIELD_GET(WILC_PKT_HDR_CONFIG_FIELD, header);
1119 pkt_offset = FIELD_GET(WILC_PKT_HDR_OFFSET_FIELD, header);
1120 tp_len = FIELD_GET(WILC_PKT_HDR_TOTAL_LEN_FIELD, header);
1121 pkt_len = FIELD_GET(WILC_PKT_HDR_LEN_FIELD, header);
1123 if (pkt_len == 0 || tp_len == 0)
1126 if (pkt_offset & IS_MANAGMEMENT) {
1127 buff_ptr += HOST_HDR_OFFSET;
1128 wilc_wfi_mgmt_rx(wilc, buff_ptr, pkt_len,
1129 pkt_offset & IS_MGMT_AUTH_PKT);
1131 if (!is_cfg_packet) {
1132 wilc_frmw_to_host(wilc, buff_ptr, pkt_len,
1135 struct wilc_cfg_rsp rsp;
1137 buff_ptr += pkt_offset;
1139 wilc_wlan_cfg_indicate_rx(wilc, buff_ptr,
1142 if (rsp.type == WILC_CFG_RSP) {
1143 if (wilc->cfg_seq_no == rsp.seq_no)
1144 complete(&wilc->cfg_event);
1145 } else if (rsp.type == WILC_CFG_RSP_STATUS) {
1146 wilc_mac_indicate(wilc);
1151 } while (offset < size);
1154 static void wilc_wlan_handle_rxq(struct wilc *wilc)
1158 struct rxq_entry_t *rqe;
1160 while (!wilc->quit) {
1161 rqe = wilc_wlan_rxq_remove(wilc);
1165 buffer = rqe->buffer;
1166 size = rqe->buffer_size;
1167 wilc_wlan_handle_rx_buff(wilc, buffer, size);
1172 complete(&wilc->cfg_event);
1175 static void wilc_unknown_isr_ext(struct wilc *wilc)
1177 wilc->hif_func->hif_clear_int_ext(wilc, 0);
1180 static void wilc_wlan_handle_isr_ext(struct wilc *wilc, u32 int_status)
1182 u32 offset = wilc->rx_buffer_offset;
1187 struct rxq_entry_t *rqe;
1189 size = FIELD_GET(WILC_INTERRUPT_DATA_SIZE, int_status) << 2;
1191 while (!size && retries < 10) {
1192 wilc->hif_func->hif_read_size(wilc, &size);
1193 size = FIELD_GET(WILC_INTERRUPT_DATA_SIZE, size) << 2;
1200 if (WILC_RX_BUFF_SIZE - offset < size)
1203 buffer = &wilc->rx_buffer[offset];
1205 wilc->hif_func->hif_clear_int_ext(wilc, DATA_INT_CLR | ENABLE_RX_VMM);
1206 ret = wilc->hif_func->hif_block_rx_ext(wilc, 0, buffer, size);
1211 wilc->rx_buffer_offset = offset;
1212 rqe = kmalloc(sizeof(*rqe), GFP_KERNEL);
1216 rqe->buffer = buffer;
1217 rqe->buffer_size = size;
1218 wilc_wlan_rxq_add(wilc, rqe);
1219 wilc_wlan_handle_rxq(wilc);
1222 void wilc_handle_isr(struct wilc *wilc)
1227 ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
1229 dev_err_ratelimited(wilc->dev, "Cannot acquire bus\n");
1233 wilc->hif_func->hif_read_int(wilc, &int_status);
1235 if (int_status & DATA_INT_EXT)
1236 wilc_wlan_handle_isr_ext(wilc, int_status);
1238 if (!(int_status & (ALL_INT_EXT)))
1239 wilc_unknown_isr_ext(wilc);
1241 ret = release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
1243 dev_err_ratelimited(wilc->dev, "Cannot release bus\n");
1245 EXPORT_SYMBOL_GPL(wilc_handle_isr);
1247 int wilc_wlan_firmware_download(struct wilc *wilc, const u8 *buffer,
1251 u32 addr, size, size2, blksz;
1259 dma_buffer = kmalloc(blksz, GFP_KERNEL);
1264 pr_debug("%s: Downloading firmware size = %d\n", __func__, buffer_size);
1266 ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
1270 wilc->hif_func->hif_read_reg(wilc, WILC_GLB_RESET_0, ®);
1272 ret = wilc->hif_func->hif_write_reg(wilc, WILC_GLB_RESET_0, reg);
1273 wilc->hif_func->hif_read_reg(wilc, WILC_GLB_RESET_0, ®);
1275 pr_err("%s: Failed to reset\n", __func__);
1277 ret = release_bus(wilc, WILC_BUS_RELEASE_ONLY);
1282 addr = get_unaligned_le32(&buffer[offset]);
1283 size = get_unaligned_le32(&buffer[offset + 4]);
1284 ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
1289 while (((int)size) && (offset < buffer_size)) {
1295 memcpy(dma_buffer, &buffer[offset], size2);
1296 ret = wilc->hif_func->hif_block_tx(wilc, addr,
1305 rv = release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
1310 pr_err("%s Bus error\n", __func__);
1313 pr_debug("%s Offset = %d\n", __func__, offset);
1314 } while (offset < buffer_size);
1323 int wilc_wlan_start(struct wilc *wilc)
1329 if (wilc->io_type == WILC_HIF_SDIO) {
1332 } else if (wilc->io_type == WILC_HIF_SPI) {
1335 ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_ONLY);
1339 ret = wilc->hif_func->hif_write_reg(wilc, WILC_VMM_CORE_CFG, reg);
1344 if (wilc->io_type == WILC_HIF_SDIO && wilc->dev_irq_num)
1345 reg |= WILC_HAVE_SDIO_IRQ_GPIO;
1347 if (is_wilc3000(wilc->chipid))
1348 reg |= WILC_HAVE_SLEEP_CLK_SRC_RTC;
1350 ret = wilc->hif_func->hif_write_reg(wilc, WILC_GP_REG_1, reg);
1354 wilc->hif_func->hif_sync_ext(wilc, NUM_INT_EXT);
1356 ret = wilc->hif_func->hif_read_reg(wilc, WILC_CHIPID, &chipid);
1360 wilc->hif_func->hif_read_reg(wilc, WILC_GLB_RESET_0, ®);
1361 if ((reg & BIT(10)) == BIT(10)) {
1363 wilc->hif_func->hif_write_reg(wilc, WILC_GLB_RESET_0, reg);
1364 wilc->hif_func->hif_read_reg(wilc, WILC_GLB_RESET_0, ®);
1368 ret = wilc->hif_func->hif_write_reg(wilc, WILC_GLB_RESET_0, reg);
1369 wilc->hif_func->hif_read_reg(wilc, WILC_GLB_RESET_0, ®);
1372 rv = release_bus(wilc, WILC_BUS_RELEASE_ONLY);
1373 return ret ? ret : rv;
1376 int wilc_wlan_stop(struct wilc *wilc, struct wilc_vif *vif)
1381 ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
1385 ret = wilc->hif_func->hif_read_reg(wilc, GLOBAL_MODE_CONTROL, ®);
1389 reg &= ~WILC_GLOBAL_MODE_ENABLE_WIFI;
1390 ret = wilc->hif_func->hif_write_reg(wilc, GLOBAL_MODE_CONTROL, reg);
1394 ret = wilc->hif_func->hif_read_reg(wilc, PWR_SEQ_MISC_CTRL, ®);
1398 reg &= ~WILC_PWR_SEQ_ENABLE_WIFI_SLEEP;
1399 ret = wilc->hif_func->hif_write_reg(wilc, PWR_SEQ_MISC_CTRL, reg);
1403 ret = wilc->hif_func->hif_read_reg(wilc, WILC_GP_REG_0, ®);
1405 netdev_err(vif->ndev, "Error while reading reg\n");
1409 ret = wilc->hif_func->hif_write_reg(wilc, WILC_GP_REG_0,
1410 (reg | WILC_ABORT_REQ_BIT));
1412 netdev_err(vif->ndev, "Error while writing reg\n");
1418 /* host comm is disabled - we can't issue sleep command anymore: */
1419 rv = release_bus(wilc, WILC_BUS_RELEASE_ONLY);
1421 return ret ? ret : rv;
1424 void wilc_wlan_cleanup(struct net_device *dev)
1426 struct txq_entry_t *tqe;
1427 struct rxq_entry_t *rqe;
1429 struct wilc_vif *vif = netdev_priv(dev);
1430 struct wilc *wilc = vif->wilc;
1433 for (ac = 0; ac < NQUEUES; ac++) {
1434 while ((tqe = wilc_wlan_txq_remove_from_head(wilc, ac))) {
1435 if (tqe->tx_complete_func)
1436 tqe->tx_complete_func(tqe->priv, 0);
1441 while ((rqe = wilc_wlan_rxq_remove(wilc)))
1444 kfree(wilc->vmm_table);
1445 wilc->vmm_table = NULL;
1446 kfree(wilc->rx_buffer);
1447 wilc->rx_buffer = NULL;
1448 kfree(wilc->tx_buffer);
1449 wilc->tx_buffer = NULL;
1450 wilc->hif_func->hif_deinit(wilc);
1453 static int wilc_wlan_cfg_commit(struct wilc_vif *vif, int type,
1456 struct wilc *wilc = vif->wilc;
1457 struct wilc_cfg_frame *cfg = &wilc->cfg_frame;
1458 int t_len = wilc->cfg_frame_offset + sizeof(struct wilc_cfg_cmd_hdr);
1460 if (type == WILC_CFG_SET)
1461 cfg->hdr.cmd_type = 'W';
1463 cfg->hdr.cmd_type = 'Q';
1465 cfg->hdr.seq_no = wilc->cfg_seq_no % 256;
1466 cfg->hdr.total_len = cpu_to_le16(t_len);
1467 cfg->hdr.driver_handler = cpu_to_le32(drv_handler);
1468 wilc->cfg_seq_no = cfg->hdr.seq_no;
1470 if (!wilc_wlan_txq_add_cfg_pkt(vif, (u8 *)&cfg->hdr, t_len))
1476 int wilc_wlan_cfg_set(struct wilc_vif *vif, int start, u16 wid, u8 *buffer,
1477 u32 buffer_size, int commit, u32 drv_handler)
1481 struct wilc *wilc = vif->wilc;
1483 mutex_lock(&wilc->cfg_cmd_lock);
1486 wilc->cfg_frame_offset = 0;
1488 offset = wilc->cfg_frame_offset;
1489 ret_size = wilc_wlan_cfg_set_wid(wilc->cfg_frame.frame, offset,
1490 wid, buffer, buffer_size);
1492 wilc->cfg_frame_offset = offset;
1495 mutex_unlock(&wilc->cfg_cmd_lock);
1499 netdev_dbg(vif->ndev, "%s: seqno[%d]\n", __func__, wilc->cfg_seq_no);
1501 if (wilc_wlan_cfg_commit(vif, WILC_CFG_SET, drv_handler))
1504 if (!wait_for_completion_timeout(&wilc->cfg_event,
1505 WILC_CFG_PKTS_TIMEOUT)) {
1506 netdev_dbg(vif->ndev, "%s: Timed Out\n", __func__);
1510 wilc->cfg_frame_offset = 0;
1511 wilc->cfg_seq_no += 1;
1512 mutex_unlock(&wilc->cfg_cmd_lock);
1517 int wilc_wlan_cfg_get(struct wilc_vif *vif, int start, u16 wid, int commit,
1522 struct wilc *wilc = vif->wilc;
1524 mutex_lock(&wilc->cfg_cmd_lock);
1527 wilc->cfg_frame_offset = 0;
1529 offset = wilc->cfg_frame_offset;
1530 ret_size = wilc_wlan_cfg_get_wid(wilc->cfg_frame.frame, offset, wid);
1532 wilc->cfg_frame_offset = offset;
1535 mutex_unlock(&wilc->cfg_cmd_lock);
1539 if (wilc_wlan_cfg_commit(vif, WILC_CFG_QUERY, drv_handler))
1542 if (!wait_for_completion_timeout(&wilc->cfg_event,
1543 WILC_CFG_PKTS_TIMEOUT)) {
1544 netdev_dbg(vif->ndev, "%s: Timed Out\n", __func__);
1547 wilc->cfg_frame_offset = 0;
1548 wilc->cfg_seq_no += 1;
1549 mutex_unlock(&wilc->cfg_cmd_lock);
1554 int wilc_send_config_pkt(struct wilc_vif *vif, u8 mode, struct wid *wids,
1559 u32 drv = wilc_get_vif_idx(vif);
1561 if (mode == WILC_GET_CFG) {
1562 for (i = 0; i < count; i++) {
1563 if (!wilc_wlan_cfg_get(vif, !i,
1571 for (i = 0; i < count; i++) {
1572 wids[i].size = wilc_wlan_cfg_get_val(vif->wilc,
1577 } else if (mode == WILC_SET_CFG) {
1578 for (i = 0; i < count; i++) {
1579 if (!wilc_wlan_cfg_set(vif, !i,
1594 int wilc_get_chipid(struct wilc *wilc)
1599 if (wilc->chipid == 0) {
1600 wilc->hif_func->hif_read_reg(wilc, WILC3000_CHIP_ID, &chipid);
1601 if (!is_wilc3000(chipid)) {
1602 wilc->hif_func->hif_read_reg(wilc, WILC_CHIPID, &chipid);
1603 wilc->hif_func->hif_read_reg(wilc, WILC_RF_REVISION_ID,
1606 if (!is_wilc1000(chipid)) {
1610 if (chipid == WILC_1000_BASE_ID_2A) { /* 0x1002A0 */
1612 chipid = WILC_1000_BASE_ID_2A_REV1;
1613 } else if (chipid == WILC_1000_BASE_ID_2B) { /* 0x1002B0 */
1615 chipid = WILC_1000_BASE_ID_2B_REV1;
1616 else if (rfrevid != 0x3)
1617 chipid = WILC_1000_BASE_ID_2B_REV2;
1621 wilc->chipid = chipid;
1626 EXPORT_SYMBOL_GPL(wilc_get_chipid);
1628 static int init_chip(struct net_device *dev)
1632 struct wilc_vif *vif = netdev_priv(dev);
1633 struct wilc *wilc = vif->wilc;
1635 ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
1639 ret = wilc_get_chipid(wilc);
1643 if ((wilc->chipid & 0xfff) != 0xa0) {
1644 ret = wilc->hif_func->hif_read_reg(wilc,
1645 WILC_CORTUS_RESET_MUX_SEL,
1648 netdev_err(dev, "fail read reg 0x1118\n");
1652 ret = wilc->hif_func->hif_write_reg(wilc,
1653 WILC_CORTUS_RESET_MUX_SEL,
1656 netdev_err(dev, "fail write reg 0x1118\n");
1659 ret = wilc->hif_func->hif_write_reg(wilc,
1660 WILC_CORTUS_BOOT_REGISTER,
1661 WILC_CORTUS_BOOT_FROM_IRAM);
1663 netdev_err(dev, "fail write reg 0xc0000\n");
1668 if (is_wilc3000(wilc->chipid)) {
1669 ret = wilc->hif_func->hif_read_reg(wilc, WILC3000_BOOTROM_STATUS, ®);
1671 netdev_err(dev, "failed to read WILC3000 BootROM status register\n");
1675 ret = wilc->hif_func->hif_write_reg(wilc, WILC3000_CORTUS_BOOT_REGISTER_2,
1676 WILC_CORTUS_BOOT_FROM_IRAM);
1678 netdev_err(dev, "failed to write WILC3000 Boot register\n");
1684 rv = release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
1686 return ret ? ret : rv;
1689 int wilc_load_mac_from_nv(struct wilc *wl)
1694 ret = acquire_bus(wl, WILC_BUS_ACQUIRE_AND_WAKEUP);
1698 for (i = 0; i < WILC_NVMEM_MAX_NUM_BANK; i++) {
1699 int bank_offset = get_bank_offset_from_bank_index(i);
1704 ret = wl->hif_func->hif_read_reg(wl,
1705 WILC_NVMEM_BANK_BASE + bank_offset,
1708 pr_err("Can not read address %d lower part", i);
1711 ret = wl->hif_func->hif_read_reg(wl,
1712 WILC_NVMEM_BANK_BASE + bank_offset + 4,
1715 pr_err("Can not read address %d upper part", i);
1719 used = FIELD_GET(WILC_NVMEM_IS_BANK_USED, reg1);
1720 invalid = FIELD_GET(WILC_NVMEM_IS_BANK_INVALID, reg1);
1721 if (!used || invalid)
1724 wl->nv_mac_address[0] = FIELD_GET(GENMASK(23, 16), reg1);
1725 wl->nv_mac_address[1] = FIELD_GET(GENMASK(15, 8), reg1);
1726 wl->nv_mac_address[2] = FIELD_GET(GENMASK(7, 0), reg1);
1727 wl->nv_mac_address[3] = FIELD_GET(GENMASK(31, 24), reg2);
1728 wl->nv_mac_address[4] = FIELD_GET(GENMASK(23, 16), reg2);
1729 wl->nv_mac_address[5] = FIELD_GET(GENMASK(15, 8), reg2);
1735 rv = release_bus(wl, WILC_BUS_RELEASE_ALLOW_SLEEP);
1736 return ret ? ret : rv;
1738 EXPORT_SYMBOL_GPL(wilc_load_mac_from_nv);
1740 int wilc_wlan_init(struct net_device *dev)
1743 struct wilc_vif *vif = netdev_priv(dev);
1750 if (!wilc->hif_func->hif_is_init(wilc)) {
1751 ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_ONLY);
1755 ret = wilc->hif_func->hif_init(wilc, false);
1757 ret = wilc_get_chipid(wilc);
1758 rv = release_bus(wilc, WILC_BUS_RELEASE_ONLY);
1764 if (!is_wilc1000(wilc->chipid) && !is_wilc3000(wilc->chipid)) {
1765 netdev_err(dev, "Unsupported chipid: %x\n", wilc->chipid);
1770 netdev_dbg(dev, "chipid (%08x)\n", wilc->chipid);
1773 if (!wilc->vmm_table)
1774 wilc->vmm_table = kcalloc(WILC_VMM_TBL_SIZE, sizeof(u32), GFP_KERNEL);
1776 if (!wilc->vmm_table) {
1781 if (!wilc->tx_buffer)
1782 wilc->tx_buffer = kmalloc(WILC_TX_BUFF_SIZE, GFP_KERNEL);
1784 if (!wilc->tx_buffer) {
1789 if (!wilc->rx_buffer)
1790 wilc->rx_buffer = kmalloc(WILC_RX_BUFF_SIZE, GFP_KERNEL);
1792 if (!wilc->rx_buffer) {
1797 if (init_chip(dev)) {
1805 kfree(wilc->vmm_table);
1806 wilc->vmm_table = NULL;
1807 kfree(wilc->rx_buffer);
1808 wilc->rx_buffer = NULL;
1809 kfree(wilc->tx_buffer);
1810 wilc->tx_buffer = NULL;