drm/rockchip: Don't change hdmi reference clock rate
[drm/drm-misc.git] / drivers / net / wireless / microchip / wilc1000 / wlan.c
blob9d80adc45d6be14c8818e8ef1643db6875cf57d2
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Copyright (c) 2012 - 2018 Microchip Technology Inc., and its subsidiaries.
4 * All rights reserved.
5 */
7 #include <linux/if_ether.h>
8 #include <linux/ip.h>
9 #include <net/dsfield.h>
10 #include "cfg80211.h"
11 #include "wlan_cfg.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)
18 list_del(&tqe->list);
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;
27 unsigned long flags;
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);
34 list_del(&tqe->list);
35 wilc->txq_entries -= 1;
36 wilc->txq[q_num].count--;
38 spin_unlock_irqrestore(&wilc->txq_spinlock, flags);
39 return tqe;
42 static void wilc_wlan_txq_add_to_tail(struct net_device *dev, u8 q_num,
43 struct txq_entry_t *tqe)
45 unsigned long flags;
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)
63 unsigned long flags;
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,
82 u32 dst_prt, u32 seq)
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;
91 f->tcp_session++;
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,
105 u32 session_index,
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;
115 txqe->ack_idx = i;
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;
124 int i;
125 unsigned long flags;
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))
136 goto out;
138 ip_hdr_ptr = buffer + ETH_HLEN;
140 if (ip_hdr_ptr->protocol != IPPROTO_TCP)
141 goto out;
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)) {
149 u32 seq_no, ack_no;
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 &&
157 j == seq_no) {
158 update_tcp_session(vif, i, ack_no);
159 break;
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);
168 out:
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;
177 u32 i = 0;
178 u32 dropped = 0;
179 unsigned long flags;
181 spin_lock_irqsave(&wilc->txq_spinlock, flags);
182 for (i = f->pending_base;
183 i < (f->pending_base + f->pending_acks_idx); i++) {
184 u32 index;
185 u32 bigger_ack_num;
187 if (i >= MAX_PENDING_ACKS)
188 break;
190 index = f->pending_acks[i].session_index;
192 if (index >= 2 * MAX_TCP_SESSION)
193 break;
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;
201 if (tqe) {
202 wilc_wlan_txq_remove(wilc, tqe->q_num, tqe);
203 tqe->status = 1;
204 if (tqe->tx_complete_func)
205 tqe->tx_complete_func(tqe->priv,
206 tqe->status);
207 kfree(tqe);
208 dropped++;
212 f->pending_acks_idx = 0;
213 f->tcp_session = 0;
215 if (f->pending_base == 0)
216 f->pending_base = MAX_TCP_SESSION;
217 else
218 f->pending_base = 0;
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));
225 dropped--;
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,
235 u32 buffer_size)
237 struct txq_entry_t *tqe;
238 struct wilc *wilc = vif->wilc;
240 netdev_dbg(vif->ndev, "Adding config packet ...\n");
241 if (wilc->quit) {
242 netdev_dbg(vif->ndev, "Return due to clear function\n");
243 complete(&wilc->cfg_event);
244 return 0;
247 tqe = kmalloc(sizeof(*tqe), GFP_ATOMIC);
248 if (!tqe) {
249 complete(&wilc->cfg_event);
250 return 0;
253 tqe->type = WILC_CFG_PKT;
254 tqe->buffer = buffer;
255 tqe->buffer_size = buffer_size;
256 tqe->tx_complete_func = NULL;
257 tqe->priv = NULL;
258 tqe->q_num = AC_VO_Q;
259 tqe->ack_idx = NOT_TCP_ACK;
260 tqe->vif = vif;
262 wilc_wlan_txq_add_to_head(vif, AC_VO_Q, tqe);
264 return 1;
267 static bool is_ac_q_limit(struct wilc *wl, u8 q_num)
269 u8 factors[NQUEUES] = {1, 1, 1, 1};
270 u16 i;
271 unsigned long flags;
272 struct wilc_tx_queue_status *q = &wl->tx_q_limit;
273 u8 end_index;
274 u8 q_limit;
275 bool ret = false;
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;
284 q->sum += q->cnt[i];
286 q->end_index = AC_BUFFER_SIZE - 1;
287 q->initialized = 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;
296 if (end_index > 0)
297 q->end_index--;
298 else
299 q->end_index = AC_BUFFER_SIZE - 1;
301 if (!q->sum)
302 q_limit = 1;
303 else
304 q_limit = (q->cnt[q_num] * FLOW_CONTROL_UPPER_THRESHOLD / q->sum) + 1;
306 if (wl->txq[q_num].count <= q_limit)
307 ret = true;
309 spin_unlock_irqrestore(&wl->txq_spinlock, flags);
311 return ret;
314 static inline u8 ac_classify(struct wilc *wilc, struct sk_buff *skb)
316 u8 q_num = AC_BE_Q;
317 u8 dscp;
319 switch (skb->protocol) {
320 case htons(ETH_P_IP):
321 dscp = ipv4_get_dsfield(ip_hdr(skb)) & 0xfc;
322 break;
323 case htons(ETH_P_IPV6):
324 dscp = ipv6_get_dsfield(ipv6_hdr(skb)) & 0xfc;
325 break;
326 default:
327 return q_num;
330 switch (dscp) {
331 case 0x08:
332 case 0x20:
333 case 0x40:
334 q_num = AC_BK_Q;
335 break;
336 case 0x80:
337 case 0xA0:
338 case 0x28:
339 q_num = AC_VI_Q;
340 break;
341 case 0xC0:
342 case 0xD0:
343 case 0xE0:
344 case 0x88:
345 case 0xB8:
346 q_num = AC_VO_Q;
347 break;
350 return q_num;
353 static inline int ac_balance(struct wilc *wl, u8 *ratio)
355 u8 i, max_count = 0;
357 if (!ratio)
358 return -EINVAL;
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;
367 return 0;
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)
385 do {
386 if (wilc->txq[*ac].fw.acm == 0)
387 return 0;
388 (*ac)++;
389 } while (*ac < NQUEUES);
391 return 1;
394 int wilc_wlan_txq_add_net_pkt(struct net_device *dev,
395 struct tx_complete_data *tx_data, u8 *buffer,
396 u32 buffer_size,
397 void (*tx_complete_fn)(void *, int))
399 struct txq_entry_t *tqe;
400 struct wilc_vif *vif = netdev_priv(dev);
401 struct wilc *wilc;
402 u8 q_num;
404 wilc = vif->wilc;
406 if (wilc->quit) {
407 tx_complete_fn(tx_data, 0);
408 return 0;
411 if (!wilc->initialized) {
412 tx_complete_fn(tx_data, 0);
413 return 0;
416 tqe = kmalloc(sizeof(*tqe), GFP_ATOMIC);
418 if (!tqe) {
419 tx_complete_fn(tx_data, 0);
420 return 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;
426 tqe->priv = tx_data;
427 tqe->vif = vif;
429 q_num = ac_classify(wilc, tx_data->skb);
430 tqe->q_num = q_num;
431 if (ac_change(wilc, &q_num)) {
432 tx_complete_fn(tx_data, 0);
433 kfree(tqe);
434 return 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);
442 } else {
443 tx_complete_fn(tx_data, 0);
444 kfree(tqe);
447 return wilc->txq_entries;
450 int wilc_wlan_txq_add_mgmt_pkt(struct net_device *dev, void *priv, u8 *buffer,
451 u32 buffer_size,
452 void (*tx_complete_fn)(void *, int))
454 struct txq_entry_t *tqe;
455 struct wilc_vif *vif = netdev_priv(dev);
456 struct wilc *wilc;
458 wilc = vif->wilc;
460 if (wilc->quit) {
461 tx_complete_fn(priv, 0);
462 return 0;
465 if (!wilc->initialized) {
466 tx_complete_fn(priv, 0);
467 return 0;
469 tqe = kmalloc(sizeof(*tqe), GFP_ATOMIC);
471 if (!tqe) {
472 tx_complete_fn(priv, 0);
473 return 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;
479 tqe->priv = priv;
480 tqe->q_num = AC_BE_Q;
481 tqe->ack_idx = NOT_TCP_ACK;
482 tqe->vif = vif;
483 wilc_wlan_txq_add_to_tail(dev, AC_VO_Q, tqe);
484 return 1;
487 static struct txq_entry_t *wilc_wlan_txq_get_first(struct wilc *wilc, u8 q_num)
489 struct txq_entry_t *tqe = NULL;
490 unsigned long flags;
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);
500 return tqe;
503 static struct txq_entry_t *wilc_wlan_txq_get_next(struct wilc *wilc,
504 struct txq_entry_t *tqe,
505 u8 q_num)
507 unsigned long flags;
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);
513 else
514 tqe = NULL;
515 spin_unlock_irqrestore(&wilc->txq_spinlock, flags);
517 return tqe;
520 static void wilc_wlan_rxq_add(struct wilc *wilc, struct rxq_entry_t *rqe)
522 if (wilc->quit)
523 return;
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,
537 list);
538 list_del(&rqe->list);
540 mutex_unlock(&wilc->rxq_cs);
541 return rqe;
544 static int chip_allow_sleep_wilc1000(struct wilc *wilc)
546 u32 reg = 0;
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;
551 u32 trials = 100;
552 int ret;
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;
561 } else {
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;
570 while (--trials) {
571 ret = hif_func->hif_read_reg(wilc, to_host_from_fw_reg, &reg);
572 if (ret)
573 return ret;
574 if ((reg & to_host_from_fw_bit) == 0)
575 break;
577 if (!trials)
578 pr_warn("FW not responding\n");
580 /* Clear bit 1 */
581 ret = hif_func->hif_read_reg(wilc, wakeup_reg, &reg);
582 if (ret)
583 return ret;
584 if (reg & wakeup_bit) {
585 reg &= ~wakeup_bit;
586 ret = hif_func->hif_write_reg(wilc, wakeup_reg, reg);
587 if (ret)
588 return ret;
591 ret = hif_func->hif_read_reg(wilc, from_host_to_fw_reg, &reg);
592 if (ret)
593 return ret;
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);
597 if (ret)
598 return ret;
601 return 0;
604 static int chip_allow_sleep_wilc3000(struct wilc *wilc)
606 u32 reg = 0;
607 int ret;
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, &reg);
612 if (ret)
613 return ret;
614 ret = hif_func->hif_write_reg(wilc, WILC_SDIO_WAKEUP_REG,
615 reg & ~WILC_SDIO_WAKEUP_BIT);
616 if (ret)
617 return ret;
618 } else {
619 ret = hif_func->hif_read_reg(wilc, WILC_SPI_WAKEUP_REG, &reg);
620 if (ret)
621 return ret;
622 ret = hif_func->hif_write_reg(wilc, WILC_SPI_WAKEUP_REG,
623 reg & ~WILC_SPI_WAKEUP_BIT);
624 if (ret)
625 return ret;
627 return 0;
630 static int chip_allow_sleep(struct wilc *wilc)
632 if (is_wilc1000(wilc->chipid))
633 return chip_allow_sleep_wilc1000(wilc);
634 else
635 return chip_allow_sleep_wilc3000(wilc);
638 static int chip_wakeup_wilc1000(struct wilc *wilc)
640 u32 ret = 0;
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;
654 } else {
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);
666 if (ret)
667 return ret;
669 /* Set wake-up bit */
670 ret = hif_func->hif_write_reg(wilc, wakeup_reg,
671 wakeup_bit);
672 if (ret)
673 return ret;
675 while (trials < WAKE_UP_TRIAL_RETRY) {
676 ret = hif_func->hif_read_reg(wilc, clk_status_reg,
677 &clk_status_val);
678 if (ret) {
679 pr_err("Bus error %d %x\n", ret, clk_status_val);
680 return ret;
682 if (clk_status_val & clk_status_bit)
683 break;
685 trials++;
687 if (trials >= WAKE_UP_TRIAL_RETRY) {
688 pr_err("Failed to wake-up the chip\n");
689 return -ETIMEDOUT;
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);
697 return 0;
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;
713 } else {
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);
721 do {
722 hif_func->hif_write_reg(wilc, wakeup_reg, wakeup_reg_val |
723 wakeup_bit);
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
739 * overhead
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");
757 return 0;
760 static int chip_wakeup(struct wilc *wilc)
762 if (is_wilc1000(wilc->chipid))
763 return chip_wakeup_wilc1000(wilc);
764 else
765 return chip_wakeup_wilc3000(wilc);
768 static inline int acquire_bus(struct wilc *wilc, enum bus_acquire acquire)
770 int ret = 0;
772 mutex_lock(&wilc->hif_cs);
773 if (acquire == WILC_BUS_ACQUIRE_AND_WAKEUP && wilc->power_save_mode) {
774 ret = chip_wakeup(wilc);
775 if (ret)
776 mutex_unlock(&wilc->hif_cs);
779 return ret;
782 static inline int release_bus(struct wilc *wilc, enum bus_release release)
784 int ret = 0;
786 if (release == WILC_BUS_RELEASE_ALLOW_SLEEP && wilc->power_save_mode)
787 ret = chip_allow_sleep(wilc);
788 mutex_unlock(&wilc->hif_cs);
790 return ret;
793 int host_wakeup_notify(struct wilc *wilc)
795 int ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
797 if (ret)
798 return ret;
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);
811 if (ret)
812 return ret;
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)
823 int i, entries = 0;
824 u8 k, ac;
825 u32 sum;
826 u32 reg;
827 u8 ac_desired_ratio[NQUEUES] = {0, 0, 0, 0};
828 u8 ac_preserve_ratio[NQUEUES] = {1, 1, 1, 1};
829 u8 *num_pkts_to_add;
830 u8 vmm_entries_ac[WILC_VMM_TBL_SIZE];
831 u32 offset = 0;
832 bool max_size_over = 0, ac_exist = 0;
833 int vmm_sz = 0;
834 struct txq_entry_t *tqe_q[NQUEUES];
835 int ret = 0;
836 int counter;
837 int timeout;
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;
841 int srcu_idx;
842 u8 *txb = wilc->tx_buffer;
843 struct wilc_vif *vif;
844 int rv;
846 if (wilc->quit)
847 goto out_update_cnt;
849 if (ac_balance(wilc, ac_desired_ratio))
850 return -EINVAL;
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);
862 i = 0;
863 sum = 0;
864 max_size_over = 0;
865 num_pkts_to_add = ac_desired_ratio;
866 do {
867 ac_exist = 0;
868 for (ac = 0; (ac < NQUEUES) && (!max_size_over); ac++) {
869 if (!tqe_q[ac])
870 continue;
872 ac_exist = 1;
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)) {
876 max_size_over = 1;
877 break;
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;
884 else
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) {
891 max_size_over = 1;
892 break;
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;
901 i++;
902 sum += vmm_sz;
903 tqe_q[ac] = wilc_wlan_txq_get_next(wilc,
904 tqe_q[ac],
905 ac);
908 num_pkts_to_add = ac_preserve_ratio;
909 } while (!max_size_over && ac_exist);
911 if (i == 0)
912 goto out_unlock;
913 vmm_table[i] = 0x0;
915 ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
916 if (ret)
917 goto out_unlock;
919 counter = 0;
920 func = wilc->hif_func;
921 do {
922 ret = func->hif_read_reg(wilc, WILC_HOST_TX_CTRL, &reg);
923 if (ret)
924 break;
926 if ((reg & 0x1) == 0) {
927 ac_update_fw_ac_pkt_info(wilc, reg);
928 break;
931 counter++;
932 if (counter > 200) {
933 counter = 0;
934 ret = func->hif_write_reg(wilc, WILC_HOST_TX_CTRL, 0);
935 break;
937 } while (!wilc->quit);
939 if (ret)
940 goto out_release_bus;
942 timeout = 200;
943 do {
944 ret = func->hif_block_tx(wilc,
945 WILC_VMM_TBL_RX_SHADOW_BASE,
946 (u8 *)vmm_table,
947 ((i + 1) * 4));
948 if (ret)
949 break;
951 if (is_wilc1000(wilc->chipid)) {
952 ret = func->hif_write_reg(wilc, WILC_HOST_VMM_CTL, 0x2);
953 if (ret)
954 break;
956 do {
957 ret = func->hif_read_reg(wilc, WILC_HOST_VMM_CTL, &reg);
958 if (ret)
959 break;
960 if (FIELD_GET(WILC_VMM_ENTRY_AVAILABLE, reg)) {
961 entries = FIELD_GET(WILC_VMM_ENTRY_COUNT, reg);
962 break;
964 } while (--timeout);
965 } else {
966 ret = func->hif_write_reg(wilc, WILC_HOST_VMM_CTL, 0);
967 if (ret)
968 break;
970 /* interrupt firmware */
971 ret = func->hif_write_reg(wilc, WILC_CORTUS_INTERRUPT_BASE, 1);
972 if (ret)
973 break;
975 do {
976 ret = func->hif_read_reg(wilc, WILC_CORTUS_INTERRUPT_BASE, &reg);
977 if (ret)
978 break;
979 if (reg == 0) {
980 /* Get the entries */
981 ret = func->hif_read_reg(wilc, WILC_HOST_VMM_CTL, &reg);
982 if (ret)
983 break;
985 entries = FIELD_GET(WILC_VMM_ENTRY_COUNT, reg);
986 break;
988 } while (--timeout);
990 if (timeout <= 0) {
991 ret = func->hif_write_reg(wilc, WILC_HOST_VMM_CTL, 0x0);
992 break;
995 if (ret)
996 break;
998 if (entries == 0) {
999 ret = func->hif_read_reg(wilc, WILC_HOST_TX_CTRL, &reg);
1000 if (ret)
1001 break;
1002 reg &= ~BIT(0);
1003 ret = func->hif_write_reg(wilc, WILC_HOST_TX_CTRL, reg);
1005 } while (0);
1007 if (ret)
1008 goto out_release_bus;
1010 if (entries == 0) {
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);
1020 if (ret)
1021 goto out_unlock;
1023 offset = 0;
1024 i = 0;
1025 do {
1026 struct txq_entry_t *tqe;
1027 u32 header, buffer_offset;
1028 char *bssid;
1029 u8 mgmt_ptk = 0;
1031 if (vmm_table[i] == 0 || vmm_entries_ac[i] >= NQUEUES)
1032 break;
1034 tqe = wilc_wlan_txq_remove_from_head(wilc, vmm_entries_ac[i]);
1035 if (!tqe)
1036 break;
1038 ac_pkt_num_to_chip[vmm_entries_ac[i]]++;
1039 vif = tqe->vif;
1041 le32_to_cpus(&vmm_table[i]);
1042 vmm_sz = FIELD_GET(WILC_VMM_BUFFER_SIZE, vmm_table[i]);
1043 vmm_sz *= 4;
1045 if (tqe->type == WILC_MGMT_PKT)
1046 mgmt_ptk = 1;
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);
1064 } else {
1065 buffer_offset = HOST_HDR_OFFSET;
1068 memcpy(&txb[offset + buffer_offset],
1069 tqe->buffer, tqe->buffer_size);
1070 offset += vmm_sz;
1071 i++;
1072 tqe->status = 1;
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;
1078 kfree(tqe);
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);
1084 if (ret)
1085 goto out_unlock;
1087 ret = func->hif_clear_int_ext(wilc, ENABLE_TX_VMM);
1088 if (ret)
1089 goto out_release_bus;
1091 ret = func->hif_block_tx_ext(wilc, 0, txb, offset);
1093 out_release_bus:
1094 rv = release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
1095 if (!ret && rv)
1096 ret = rv;
1098 out_unlock:
1099 mutex_unlock(&wilc->txq_add_to_head_cs);
1101 out_update_cnt:
1102 *txq_count = wilc->txq_entries;
1103 return ret;
1106 static void wilc_wlan_handle_rx_buff(struct wilc *wilc, u8 *buffer, int size)
1108 int offset = 0;
1109 u32 header;
1110 u32 pkt_len, pkt_offset, tp_len;
1111 int is_cfg_packet;
1112 u8 *buff_ptr;
1114 do {
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)
1124 break;
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);
1130 } else {
1131 if (!is_cfg_packet) {
1132 wilc_frmw_to_host(wilc, buff_ptr, pkt_len,
1133 pkt_offset);
1134 } else {
1135 struct wilc_cfg_rsp rsp;
1137 buff_ptr += pkt_offset;
1139 wilc_wlan_cfg_indicate_rx(wilc, buff_ptr,
1140 pkt_len,
1141 &rsp);
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);
1150 offset += tp_len;
1151 } while (offset < size);
1154 static void wilc_wlan_handle_rxq(struct wilc *wilc)
1156 int size;
1157 u8 *buffer;
1158 struct rxq_entry_t *rqe;
1160 while (!wilc->quit) {
1161 rqe = wilc_wlan_rxq_remove(wilc);
1162 if (!rqe)
1163 break;
1165 buffer = rqe->buffer;
1166 size = rqe->buffer_size;
1167 wilc_wlan_handle_rx_buff(wilc, buffer, size);
1169 kfree(rqe);
1171 if (wilc->quit)
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;
1183 u8 *buffer = NULL;
1184 u32 size;
1185 u32 retries = 0;
1186 int ret = 0;
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;
1194 retries++;
1197 if (size <= 0)
1198 return;
1200 if (WILC_RX_BUFF_SIZE - offset < size)
1201 offset = 0;
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);
1207 if (ret)
1208 return;
1210 offset += size;
1211 wilc->rx_buffer_offset = offset;
1212 rqe = kmalloc(sizeof(*rqe), GFP_KERNEL);
1213 if (!rqe)
1214 return;
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)
1224 u32 int_status;
1225 int ret;
1227 ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
1228 if (ret) {
1229 dev_err_ratelimited(wilc->dev, "Cannot acquire bus\n");
1230 return;
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);
1242 if (ret)
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,
1248 u32 buffer_size)
1250 u32 offset;
1251 u32 addr, size, size2, blksz;
1252 u8 *dma_buffer;
1253 int ret = 0;
1254 u32 reg = 0;
1255 int rv;
1257 blksz = BIT(12);
1259 dma_buffer = kmalloc(blksz, GFP_KERNEL);
1260 if (!dma_buffer)
1261 return -EIO;
1263 offset = 0;
1264 pr_debug("%s: Downloading firmware size = %d\n", __func__, buffer_size);
1266 ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
1267 if (ret)
1268 return ret;
1270 wilc->hif_func->hif_read_reg(wilc, WILC_GLB_RESET_0, &reg);
1271 reg &= ~BIT(10);
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, &reg);
1274 if (reg & BIT(10))
1275 pr_err("%s: Failed to reset\n", __func__);
1277 ret = release_bus(wilc, WILC_BUS_RELEASE_ONLY);
1278 if (ret)
1279 goto fail;
1281 do {
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);
1285 if (ret)
1286 goto fail;
1288 offset += 8;
1289 while (((int)size) && (offset < buffer_size)) {
1290 if (size <= blksz)
1291 size2 = size;
1292 else
1293 size2 = blksz;
1295 memcpy(dma_buffer, &buffer[offset], size2);
1296 ret = wilc->hif_func->hif_block_tx(wilc, addr,
1297 dma_buffer, size2);
1298 if (ret)
1299 break;
1301 addr += size2;
1302 offset += size2;
1303 size -= size2;
1305 rv = release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
1306 if (!ret && rv)
1307 ret = rv;
1309 if (ret) {
1310 pr_err("%s Bus error\n", __func__);
1311 goto fail;
1313 pr_debug("%s Offset = %d\n", __func__, offset);
1314 } while (offset < buffer_size);
1316 fail:
1318 kfree(dma_buffer);
1320 return ret;
1323 int wilc_wlan_start(struct wilc *wilc)
1325 u32 reg = 0;
1326 int ret, rv;
1327 u32 chipid;
1329 if (wilc->io_type == WILC_HIF_SDIO) {
1330 reg = 0;
1331 reg |= BIT(3);
1332 } else if (wilc->io_type == WILC_HIF_SPI) {
1333 reg = 1;
1335 ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_ONLY);
1336 if (ret)
1337 return ret;
1339 ret = wilc->hif_func->hif_write_reg(wilc, WILC_VMM_CORE_CFG, reg);
1340 if (ret)
1341 goto release;
1343 reg = 0;
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);
1351 if (ret)
1352 goto release;
1354 wilc->hif_func->hif_sync_ext(wilc, NUM_INT_EXT);
1356 ret = wilc->hif_func->hif_read_reg(wilc, WILC_CHIPID, &chipid);
1357 if (ret)
1358 goto release;
1360 wilc->hif_func->hif_read_reg(wilc, WILC_GLB_RESET_0, &reg);
1361 if ((reg & BIT(10)) == BIT(10)) {
1362 reg &= ~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, &reg);
1367 reg |= BIT(10);
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, &reg);
1371 release:
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)
1378 u32 reg = 0;
1379 int ret, rv;
1381 ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
1382 if (ret)
1383 return ret;
1385 ret = wilc->hif_func->hif_read_reg(wilc, GLOBAL_MODE_CONTROL, &reg);
1386 if (ret)
1387 goto release;
1389 reg &= ~WILC_GLOBAL_MODE_ENABLE_WIFI;
1390 ret = wilc->hif_func->hif_write_reg(wilc, GLOBAL_MODE_CONTROL, reg);
1391 if (ret)
1392 goto release;
1394 ret = wilc->hif_func->hif_read_reg(wilc, PWR_SEQ_MISC_CTRL, &reg);
1395 if (ret)
1396 goto release;
1398 reg &= ~WILC_PWR_SEQ_ENABLE_WIFI_SLEEP;
1399 ret = wilc->hif_func->hif_write_reg(wilc, PWR_SEQ_MISC_CTRL, reg);
1400 if (ret)
1401 goto release;
1403 ret = wilc->hif_func->hif_read_reg(wilc, WILC_GP_REG_0, &reg);
1404 if (ret) {
1405 netdev_err(vif->ndev, "Error while reading reg\n");
1406 goto release;
1409 ret = wilc->hif_func->hif_write_reg(wilc, WILC_GP_REG_0,
1410 (reg | WILC_ABORT_REQ_BIT));
1411 if (ret) {
1412 netdev_err(vif->ndev, "Error while writing reg\n");
1413 goto release;
1416 ret = 0;
1417 release:
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;
1428 u8 ac;
1429 struct wilc_vif *vif = netdev_priv(dev);
1430 struct wilc *wilc = vif->wilc;
1432 wilc->quit = 1;
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);
1437 kfree(tqe);
1441 while ((rqe = wilc_wlan_rxq_remove(wilc)))
1442 kfree(rqe);
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,
1454 u32 drv_handler)
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';
1462 else
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))
1471 return -1;
1473 return 0;
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)
1479 u32 offset;
1480 int ret_size;
1481 struct wilc *wilc = vif->wilc;
1483 mutex_lock(&wilc->cfg_cmd_lock);
1485 if (start)
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);
1491 offset += ret_size;
1492 wilc->cfg_frame_offset = offset;
1494 if (!commit) {
1495 mutex_unlock(&wilc->cfg_cmd_lock);
1496 return ret_size;
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))
1502 ret_size = 0;
1504 if (!wait_for_completion_timeout(&wilc->cfg_event,
1505 WILC_CFG_PKTS_TIMEOUT)) {
1506 netdev_dbg(vif->ndev, "%s: Timed Out\n", __func__);
1507 ret_size = 0;
1510 wilc->cfg_frame_offset = 0;
1511 wilc->cfg_seq_no += 1;
1512 mutex_unlock(&wilc->cfg_cmd_lock);
1514 return ret_size;
1517 int wilc_wlan_cfg_get(struct wilc_vif *vif, int start, u16 wid, int commit,
1518 u32 drv_handler)
1520 u32 offset;
1521 int ret_size;
1522 struct wilc *wilc = vif->wilc;
1524 mutex_lock(&wilc->cfg_cmd_lock);
1526 if (start)
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);
1531 offset += ret_size;
1532 wilc->cfg_frame_offset = offset;
1534 if (!commit) {
1535 mutex_unlock(&wilc->cfg_cmd_lock);
1536 return ret_size;
1539 if (wilc_wlan_cfg_commit(vif, WILC_CFG_QUERY, drv_handler))
1540 ret_size = 0;
1542 if (!wait_for_completion_timeout(&wilc->cfg_event,
1543 WILC_CFG_PKTS_TIMEOUT)) {
1544 netdev_dbg(vif->ndev, "%s: Timed Out\n", __func__);
1545 ret_size = 0;
1547 wilc->cfg_frame_offset = 0;
1548 wilc->cfg_seq_no += 1;
1549 mutex_unlock(&wilc->cfg_cmd_lock);
1551 return ret_size;
1554 int wilc_send_config_pkt(struct wilc_vif *vif, u8 mode, struct wid *wids,
1555 u32 count)
1557 int i;
1558 int ret = 0;
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,
1564 wids[i].id,
1565 (i == count - 1),
1566 drv)) {
1567 ret = -ETIMEDOUT;
1568 break;
1571 for (i = 0; i < count; i++) {
1572 wids[i].size = wilc_wlan_cfg_get_val(vif->wilc,
1573 wids[i].id,
1574 wids[i].val,
1575 wids[i].size);
1577 } else if (mode == WILC_SET_CFG) {
1578 for (i = 0; i < count; i++) {
1579 if (!wilc_wlan_cfg_set(vif, !i,
1580 wids[i].id,
1581 wids[i].val,
1582 wids[i].size,
1583 (i == count - 1),
1584 drv)) {
1585 ret = -ETIMEDOUT;
1586 break;
1591 return ret;
1594 int wilc_get_chipid(struct wilc *wilc)
1596 u32 chipid = 0;
1597 u32 rfrevid = 0;
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,
1604 &rfrevid);
1606 if (!is_wilc1000(chipid)) {
1607 wilc->chipid = 0;
1608 return -EINVAL;
1610 if (chipid == WILC_1000_BASE_ID_2A) { /* 0x1002A0 */
1611 if (rfrevid != 0x1)
1612 chipid = WILC_1000_BASE_ID_2A_REV1;
1613 } else if (chipid == WILC_1000_BASE_ID_2B) { /* 0x1002B0 */
1614 if (rfrevid == 0x4)
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;
1624 return 0;
1626 EXPORT_SYMBOL_GPL(wilc_get_chipid);
1628 static int init_chip(struct net_device *dev)
1630 u32 reg;
1631 int ret, rv;
1632 struct wilc_vif *vif = netdev_priv(dev);
1633 struct wilc *wilc = vif->wilc;
1635 ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
1636 if (ret)
1637 return ret;
1639 ret = wilc_get_chipid(wilc);
1640 if (ret)
1641 goto release;
1643 if ((wilc->chipid & 0xfff) != 0xa0) {
1644 ret = wilc->hif_func->hif_read_reg(wilc,
1645 WILC_CORTUS_RESET_MUX_SEL,
1646 &reg);
1647 if (ret) {
1648 netdev_err(dev, "fail read reg 0x1118\n");
1649 goto release;
1651 reg |= BIT(0);
1652 ret = wilc->hif_func->hif_write_reg(wilc,
1653 WILC_CORTUS_RESET_MUX_SEL,
1654 reg);
1655 if (ret) {
1656 netdev_err(dev, "fail write reg 0x1118\n");
1657 goto release;
1659 ret = wilc->hif_func->hif_write_reg(wilc,
1660 WILC_CORTUS_BOOT_REGISTER,
1661 WILC_CORTUS_BOOT_FROM_IRAM);
1662 if (ret) {
1663 netdev_err(dev, "fail write reg 0xc0000\n");
1664 goto release;
1668 if (is_wilc3000(wilc->chipid)) {
1669 ret = wilc->hif_func->hif_read_reg(wilc, WILC3000_BOOTROM_STATUS, &reg);
1670 if (ret) {
1671 netdev_err(dev, "failed to read WILC3000 BootROM status register\n");
1672 goto release;
1675 ret = wilc->hif_func->hif_write_reg(wilc, WILC3000_CORTUS_BOOT_REGISTER_2,
1676 WILC_CORTUS_BOOT_FROM_IRAM);
1677 if (ret) {
1678 netdev_err(dev, "failed to write WILC3000 Boot register\n");
1679 goto release;
1683 release:
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)
1691 int ret, rv;
1692 unsigned int i;
1694 ret = acquire_bus(wl, WILC_BUS_ACQUIRE_AND_WAKEUP);
1695 if (ret)
1696 return ret;
1698 for (i = 0; i < WILC_NVMEM_MAX_NUM_BANK; i++) {
1699 int bank_offset = get_bank_offset_from_bank_index(i);
1700 u32 reg1, reg2;
1701 u8 invalid;
1702 u8 used;
1704 ret = wl->hif_func->hif_read_reg(wl,
1705 WILC_NVMEM_BANK_BASE + bank_offset,
1706 &reg1);
1707 if (ret) {
1708 pr_err("Can not read address %d lower part", i);
1709 break;
1711 ret = wl->hif_func->hif_read_reg(wl,
1712 WILC_NVMEM_BANK_BASE + bank_offset + 4,
1713 &reg2);
1714 if (ret) {
1715 pr_err("Can not read address %d upper part", i);
1716 break;
1719 used = FIELD_GET(WILC_NVMEM_IS_BANK_USED, reg1);
1720 invalid = FIELD_GET(WILC_NVMEM_IS_BANK_INVALID, reg1);
1721 if (!used || invalid)
1722 continue;
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);
1731 ret = 0;
1732 break;
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)
1742 int ret = 0, rv;
1743 struct wilc_vif *vif = netdev_priv(dev);
1744 struct wilc *wilc;
1746 wilc = vif->wilc;
1748 wilc->quit = 0;
1750 if (!wilc->hif_func->hif_is_init(wilc)) {
1751 ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_ONLY);
1752 if (ret)
1753 return ret;
1755 ret = wilc->hif_func->hif_init(wilc, false);
1756 if (!ret)
1757 ret = wilc_get_chipid(wilc);
1758 rv = release_bus(wilc, WILC_BUS_RELEASE_ONLY);
1759 if (!ret && rv)
1760 ret = rv;
1761 if (ret)
1762 goto fail;
1764 if (!is_wilc1000(wilc->chipid) && !is_wilc3000(wilc->chipid)) {
1765 netdev_err(dev, "Unsupported chipid: %x\n", wilc->chipid);
1766 ret = -EINVAL;
1767 goto fail;
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) {
1777 ret = -ENOBUFS;
1778 goto fail;
1781 if (!wilc->tx_buffer)
1782 wilc->tx_buffer = kmalloc(WILC_TX_BUFF_SIZE, GFP_KERNEL);
1784 if (!wilc->tx_buffer) {
1785 ret = -ENOBUFS;
1786 goto fail;
1789 if (!wilc->rx_buffer)
1790 wilc->rx_buffer = kmalloc(WILC_RX_BUFF_SIZE, GFP_KERNEL);
1792 if (!wilc->rx_buffer) {
1793 ret = -ENOBUFS;
1794 goto fail;
1797 if (init_chip(dev)) {
1798 ret = -EIO;
1799 goto fail;
1802 return 0;
1804 fail:
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;
1812 return ret;