]> Git Repo - linux.git/blob - drivers/net/wireless/microchip/wilc1000/wlan.c
Linux 6.14-rc3
[linux.git] / drivers / net / wireless / microchip / wilc1000 / wlan.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2012 - 2018 Microchip Technology Inc., and its subsidiaries.
4  * All rights reserved.
5  */
6
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"
12
13 #define WAKE_UP_TRIAL_RETRY             10000
14
15 static void wilc_wlan_txq_remove(struct wilc *wilc, u8 q_num,
16                                  struct txq_entry_t *tqe)
17 {
18         list_del(&tqe->list);
19         wilc->txq_entries -= 1;
20         wilc->txq[q_num].count--;
21 }
22
23 static struct txq_entry_t *
24 wilc_wlan_txq_remove_from_head(struct wilc *wilc, u8 q_num)
25 {
26         struct txq_entry_t *tqe = NULL;
27         unsigned long flags;
28
29         spin_lock_irqsave(&wilc->txq_spinlock, flags);
30
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--;
37         }
38         spin_unlock_irqrestore(&wilc->txq_spinlock, flags);
39         return tqe;
40 }
41
42 static void wilc_wlan_txq_add_to_tail(struct net_device *dev, u8 q_num,
43                                       struct txq_entry_t *tqe)
44 {
45         unsigned long flags;
46         struct wilc_vif *vif = netdev_priv(dev);
47         struct wilc *wilc = vif->wilc;
48
49         spin_lock_irqsave(&wilc->txq_spinlock, flags);
50
51         list_add_tail(&tqe->list, &wilc->txq[q_num].txq_head.list);
52         wilc->txq_entries += 1;
53         wilc->txq[q_num].count++;
54
55         spin_unlock_irqrestore(&wilc->txq_spinlock, flags);
56
57         complete(&wilc->txq_event);
58 }
59
60 static void wilc_wlan_txq_add_to_head(struct wilc_vif *vif, u8 q_num,
61                                       struct txq_entry_t *tqe)
62 {
63         unsigned long flags;
64         struct wilc *wilc = vif->wilc;
65
66         mutex_lock(&wilc->txq_add_to_head_cs);
67
68         spin_lock_irqsave(&wilc->txq_spinlock, flags);
69
70         list_add(&tqe->list, &wilc->txq[q_num].txq_head.list);
71         wilc->txq_entries += 1;
72         wilc->txq[q_num].count++;
73
74         spin_unlock_irqrestore(&wilc->txq_spinlock, flags);
75         mutex_unlock(&wilc->txq_add_to_head_cs);
76         complete(&wilc->txq_event);
77 }
78
79 #define NOT_TCP_ACK                     (-1)
80
81 static inline void add_tcp_session(struct wilc_vif *vif, u32 src_prt,
82                                    u32 dst_prt, u32 seq)
83 {
84         struct tcp_ack_filter *f = &vif->ack_filter;
85
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++;
92         }
93 }
94
95 static inline void update_tcp_session(struct wilc_vif *vif, u32 index, u32 ack)
96 {
97         struct tcp_ack_filter *f = &vif->ack_filter;
98
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;
102 }
103
104 static inline void add_tcp_pending_ack(struct wilc_vif *vif, u32 ack,
105                                        u32 session_index,
106                                        struct txq_entry_t *txqe)
107 {
108         struct tcp_ack_filter *f = &vif->ack_filter;
109         u32 i = f->pending_base + f->pending_acks_idx;
110
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++;
117         }
118 }
119
120 static inline void tcp_process(struct net_device *dev, struct txq_entry_t *tqe)
121 {
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;
132
133         spin_lock_irqsave(&wilc->txq_spinlock, flags);
134
135         if (eth_hdr_ptr->h_proto != htons(ETH_P_IP))
136                 goto out;
137
138         ip_hdr_ptr = buffer + ETH_HLEN;
139
140         if (ip_hdr_ptr->protocol != IPPROTO_TCP)
141                 goto out;
142
143         ihl = ip_hdr_ptr->ihl << 2;
144         tcp_hdr_ptr = buffer + ETH_HLEN + ihl;
145         total_length = ntohs(ip_hdr_ptr->tot_len);
146
147         data_offset = tcp_hdr_ptr->doff << 2;
148         if (total_length == (ihl + data_offset)) {
149                 u32 seq_no, ack_no;
150
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;
155
156                         if (i < 2 * MAX_TCP_SESSION &&
157                             j == seq_no) {
158                                 update_tcp_session(vif, i, ack_no);
159                                 break;
160                         }
161                 }
162                 if (i == f->tcp_session)
163                         add_tcp_session(vif, 0, 0, seq_no);
164
165                 add_tcp_pending_ack(vif, ack_no, i, tqe);
166         }
167
168 out:
169         spin_unlock_irqrestore(&wilc->txq_spinlock, flags);
170 }
171
172 static void wilc_wlan_txq_filter_dup_tcp_ack(struct net_device *dev)
173 {
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;
180
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;
186
187                 if (i >= MAX_PENDING_ACKS)
188                         break;
189
190                 index = f->pending_acks[i].session_index;
191
192                 if (index >= 2 * MAX_TCP_SESSION)
193                         break;
194
195                 bigger_ack_num = f->ack_session_info[index].bigger_ack_num;
196
197                 if (f->pending_acks[i].ack_num < bigger_ack_num) {
198                         struct txq_entry_t *tqe;
199
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++;
209                         }
210                 }
211         }
212         f->pending_acks_idx = 0;
213         f->tcp_session = 0;
214
215         if (f->pending_base == 0)
216                 f->pending_base = MAX_TCP_SESSION;
217         else
218                 f->pending_base = 0;
219
220         spin_unlock_irqrestore(&wilc->txq_spinlock, flags);
221
222         while (dropped > 0) {
223                 wait_for_completion_timeout(&wilc->txq_event,
224                                             msecs_to_jiffies(1));
225                 dropped--;
226         }
227 }
228
229 void wilc_enable_tcp_ack_filter(struct wilc_vif *vif, bool value)
230 {
231         vif->ack_filter.enabled = value;
232 }
233
234 static int wilc_wlan_txq_add_cfg_pkt(struct wilc_vif *vif, u8 *buffer,
235                                      u32 buffer_size)
236 {
237         struct txq_entry_t *tqe;
238         struct wilc *wilc = vif->wilc;
239
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;
245         }
246
247         tqe = kmalloc(sizeof(*tqe), GFP_ATOMIC);
248         if (!tqe) {
249                 complete(&wilc->cfg_event);
250                 return 0;
251         }
252
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;
261
262         wilc_wlan_txq_add_to_head(vif, AC_VO_Q, tqe);
263
264         return 1;
265 }
266
267 static bool is_ac_q_limit(struct wilc *wl, u8 q_num)
268 {
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;
276
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;
281
282                 for (i = 0; i < NQUEUES; i++) {
283                         q->cnt[i] = AC_BUFFER_SIZE * factors[i] / NQUEUES;
284                         q->sum += q->cnt[i];
285                 }
286                 q->end_index = AC_BUFFER_SIZE - 1;
287                 q->initialized = 1;
288         }
289
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]]);
294
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;
300
301         if (!q->sum)
302                 q_limit = 1;
303         else
304                 q_limit = (q->cnt[q_num] * FLOW_CONTROL_UPPER_THRESHOLD / q->sum) + 1;
305
306         if (wl->txq[q_num].count <= q_limit)
307                 ret = true;
308
309         spin_unlock_irqrestore(&wl->txq_spinlock, flags);
310
311         return ret;
312 }
313
314 static inline u8 ac_classify(struct wilc *wilc, struct sk_buff *skb)
315 {
316         u8 q_num = AC_BE_Q;
317         u8 dscp;
318
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;
328         }
329
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;
348         }
349
350         return q_num;
351 }
352
353 static inline int ac_balance(struct wilc *wl, u8 *ratio)
354 {
355         u8 i, max_count = 0;
356
357         if (!ratio)
358                 return -EINVAL;
359
360         for (i = 0; i < NQUEUES; i++)
361                 if (wl->txq[i].fw.count > max_count)
362                         max_count = wl->txq[i].fw.count;
363
364         for (i = 0; i < NQUEUES; i++)
365                 ratio[i] = max_count - wl->txq[i].fw.count;
366
367         return 0;
368 }
369
370 static inline void ac_update_fw_ac_pkt_info(struct wilc *wl, u32 reg)
371 {
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);
376
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);
381 }
382
383 static inline u8 ac_change(struct wilc *wilc, u8 *ac)
384 {
385         do {
386                 if (wilc->txq[*ac].fw.acm == 0)
387                         return 0;
388                 (*ac)++;
389         } while (*ac < NQUEUES);
390
391         return 1;
392 }
393
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))
398 {
399         struct txq_entry_t *tqe;
400         struct wilc_vif *vif = netdev_priv(dev);
401         struct wilc *wilc;
402         u8 q_num;
403
404         wilc = vif->wilc;
405
406         if (wilc->quit) {
407                 tx_complete_fn(tx_data, 0);
408                 return 0;
409         }
410
411         if (!wilc->initialized) {
412                 tx_complete_fn(tx_data, 0);
413                 return 0;
414         }
415
416         tqe = kmalloc(sizeof(*tqe), GFP_ATOMIC);
417
418         if (!tqe) {
419                 tx_complete_fn(tx_data, 0);
420                 return 0;
421         }
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;
428
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;
435         }
436
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);
445         }
446
447         return wilc->txq_entries;
448 }
449
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))
453 {
454         struct txq_entry_t *tqe;
455         struct wilc_vif *vif = netdev_priv(dev);
456         struct wilc *wilc;
457
458         wilc = vif->wilc;
459
460         if (wilc->quit) {
461                 tx_complete_fn(priv, 0);
462                 return 0;
463         }
464
465         if (!wilc->initialized) {
466                 tx_complete_fn(priv, 0);
467                 return 0;
468         }
469         tqe = kmalloc(sizeof(*tqe), GFP_ATOMIC);
470
471         if (!tqe) {
472                 tx_complete_fn(priv, 0);
473                 return 0;
474         }
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;
485 }
486
487 static struct txq_entry_t *wilc_wlan_txq_get_first(struct wilc *wilc, u8 q_num)
488 {
489         struct txq_entry_t *tqe = NULL;
490         unsigned long flags;
491
492         spin_lock_irqsave(&wilc->txq_spinlock, flags);
493
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);
497
498         spin_unlock_irqrestore(&wilc->txq_spinlock, flags);
499
500         return tqe;
501 }
502
503 static struct txq_entry_t *wilc_wlan_txq_get_next(struct wilc *wilc,
504                                                   struct txq_entry_t *tqe,
505                                                   u8 q_num)
506 {
507         unsigned long flags;
508
509         spin_lock_irqsave(&wilc->txq_spinlock, flags);
510
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);
516
517         return tqe;
518 }
519
520 static void wilc_wlan_rxq_add(struct wilc *wilc, struct rxq_entry_t *rqe)
521 {
522         if (wilc->quit)
523                 return;
524
525         mutex_lock(&wilc->rxq_cs);
526         list_add_tail(&rqe->list, &wilc->rxq_head.list);
527         mutex_unlock(&wilc->rxq_cs);
528 }
529
530 static struct rxq_entry_t *wilc_wlan_rxq_remove(struct wilc *wilc)
531 {
532         struct rxq_entry_t *rqe = NULL;
533
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);
539         }
540         mutex_unlock(&wilc->rxq_cs);
541         return rqe;
542 }
543
544 static int chip_allow_sleep_wilc1000(struct wilc *wilc)
545 {
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;
553
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;
568         }
569
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;
576         }
577         if (!trials)
578                 pr_warn("FW not responding\n");
579
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;
589         }
590
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;
599         }
600
601         return 0;
602 }
603
604 static int chip_allow_sleep_wilc3000(struct wilc *wilc)
605 {
606         u32 reg = 0;
607         int ret;
608         const struct wilc_hif_func *hif_func = wilc->hif_func;
609
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;
626         }
627         return 0;
628 }
629
630 static int chip_allow_sleep(struct wilc *wilc)
631 {
632         if (is_wilc1000(wilc->chipid))
633                 return chip_allow_sleep_wilc1000(wilc);
634         else
635                 return chip_allow_sleep_wilc3000(wilc);
636 }
637
638 static int chip_wakeup_wilc1000(struct wilc *wilc)
639 {
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;
646
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;
661         }
662
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;
668
669         /* Set wake-up bit */
670         ret = hif_func->hif_write_reg(wilc, wakeup_reg,
671                                       wakeup_bit);
672         if (ret)
673                 return ret;
674
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;
681                 }
682                 if (clk_status_val & clk_status_bit)
683                         break;
684
685                 trials++;
686         }
687         if (trials >= WAKE_UP_TRIAL_RETRY) {
688                 pr_err("Failed to wake-up the chip\n");
689                 return -ETIMEDOUT;
690         }
691         /* Sometimes spi fail to read clock regs after reading
692          * writing clockless registers
693          */
694         if (wilc->io_type == WILC_HIF_SPI)
695                 wilc->hif_func->hif_reset(wilc);
696
697         return 0;
698 }
699
700 static int chip_wakeup_wilc3000(struct wilc *wilc)
701 {
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;
707
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;
718         }
719
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);
727
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
731                  */
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);
736
737                         /* Make sure chip is awake. This is an extra step that
738                          * can be removed later to avoid the bus access
739                          * overhead
740                          */
741                         hif_func->hif_read_reg(wilc, clk_status_reg,
742                                                &clk_status_reg_val);
743                 }
744                 /* in case of failure, Reset the wakeup bit to introduce a new
745                  * edge on the next loop
746                  */
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);
752                 }
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");
756
757         return 0;
758 }
759
760 static int chip_wakeup(struct wilc *wilc)
761 {
762         if (is_wilc1000(wilc->chipid))
763                 return chip_wakeup_wilc1000(wilc);
764         else
765                 return chip_wakeup_wilc3000(wilc);
766 }
767
768 static inline int acquire_bus(struct wilc *wilc, enum bus_acquire acquire)
769 {
770         int ret = 0;
771
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);
777         }
778
779         return ret;
780 }
781
782 static inline int release_bus(struct wilc *wilc, enum bus_release release)
783 {
784         int ret = 0;
785
786         if (release == WILC_BUS_RELEASE_ALLOW_SLEEP && wilc->power_save_mode)
787                 ret = chip_allow_sleep(wilc);
788         mutex_unlock(&wilc->hif_cs);
789
790         return ret;
791 }
792
793 int host_wakeup_notify(struct wilc *wilc)
794 {
795         int ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
796
797         if (ret)
798                 return ret;
799
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);
804 }
805 EXPORT_SYMBOL_GPL(host_wakeup_notify);
806
807 int host_sleep_notify(struct wilc *wilc)
808 {
809         int ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
810
811         if (ret)
812                 return ret;
813
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);
818 }
819 EXPORT_SYMBOL_GPL(host_sleep_notify);
820
821 int wilc_wlan_handle_txq(struct wilc *wilc, u32 *txq_count)
822 {
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;
845
846         if (wilc->quit)
847                 goto out_update_cnt;
848
849         if (ac_balance(wilc, ac_desired_ratio))
850                 return -EINVAL;
851
852         mutex_lock(&wilc->txq_add_to_head_cs);
853
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);
858
859         for (ac = 0; ac < NQUEUES; ac++)
860                 tqe_q[ac] = wilc_wlan_txq_get_first(wilc, ac);
861
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;
871
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;
878                                 }
879
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;
886
887                                 vmm_sz += tqe_q[ac]->buffer_size;
888                                 vmm_sz = ALIGN(vmm_sz, 4);
889
890                                 if ((sum + vmm_sz) > WILC_TX_BUFF_SIZE) {
891                                         max_size_over = 1;
892                                         break;
893                                 }
894                                 vmm_table[i] = vmm_sz / 4;
895                                 if (tqe_q[ac]->type == WILC_CFG_PKT)
896                                         vmm_table[i] |= BIT(10);
897
898                                 cpu_to_le32s(&vmm_table[i]);
899                                 vmm_entries_ac[i] = ac;
900
901                                 i++;
902                                 sum += vmm_sz;
903                                 tqe_q[ac] = wilc_wlan_txq_get_next(wilc,
904                                                                    tqe_q[ac],
905                                                                    ac);
906                         }
907                 }
908                 num_pkts_to_add = ac_preserve_ratio;
909         } while (!max_size_over && ac_exist);
910
911         if (i == 0)
912                 goto out_unlock;
913         vmm_table[i] = 0x0;
914
915         ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
916         if (ret)
917                 goto out_unlock;
918
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;
925
926                 if ((reg & 0x1) == 0) {
927                         ac_update_fw_ac_pkt_info(wilc, reg);
928                         break;
929                 }
930
931                 counter++;
932                 if (counter > 200) {
933                         counter = 0;
934                         ret = func->hif_write_reg(wilc, WILC_HOST_TX_CTRL, 0);
935                         break;
936                 }
937         } while (!wilc->quit);
938
939         if (ret)
940                 goto out_release_bus;
941
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;
950
951                 if (is_wilc1000(wilc->chipid)) {
952                         ret = func->hif_write_reg(wilc, WILC_HOST_VMM_CTL, 0x2);
953                         if (ret)
954                                 break;
955
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;
963                                 }
964                         } while (--timeout);
965                 } else {
966                         ret = func->hif_write_reg(wilc, WILC_HOST_VMM_CTL, 0);
967                         if (ret)
968                                 break;
969
970                         /* interrupt firmware */
971                         ret = func->hif_write_reg(wilc, WILC_CORTUS_INTERRUPT_BASE, 1);
972                         if (ret)
973                                 break;
974
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;
984
985                                         entries = FIELD_GET(WILC_VMM_ENTRY_COUNT, reg);
986                                         break;
987                                 }
988                         } while (--timeout);
989                 }
990                 if (timeout <= 0) {
991                         ret = func->hif_write_reg(wilc, WILC_HOST_VMM_CTL, 0x0);
992                         break;
993                 }
994
995                 if (ret)
996                         break;
997
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);
1004                 }
1005         } while (0);
1006
1007         if (ret)
1008                 goto out_release_bus;
1009
1010         if (entries == 0) {
1011                 /*
1012                  * No VMM space available in firmware so retry to transmit
1013                  * the packet from tx queue.
1014                  */
1015                 ret = WILC_VMM_ENTRY_FULL_RETRY;
1016                 goto out_release_bus;
1017         }
1018
1019         ret = release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
1020         if (ret)
1021                 goto out_unlock;
1022
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;
1030
1031                 if (vmm_table[i] == 0 || vmm_entries_ac[i] >= NQUEUES)
1032                         break;
1033
1034                 tqe = wilc_wlan_txq_remove_from_head(wilc, vmm_entries_ac[i]);
1035                 if (!tqe)
1036                         break;
1037
1038                 ac_pkt_num_to_chip[vmm_entries_ac[i]]++;
1039                 vif = tqe->vif;
1040
1041                 le32_to_cpus(&vmm_table[i]);
1042                 vmm_sz = FIELD_GET(WILC_VMM_BUFFER_SIZE, vmm_table[i]);
1043                 vmm_sz *= 4;
1044
1045                 if (tqe->type == WILC_MGMT_PKT)
1046                         mgmt_ptk = 1;
1047
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));
1052
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;
1059
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;
1066                 }
1067
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];
1082
1083         ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
1084         if (ret)
1085                 goto out_unlock;
1086
1087         ret = func->hif_clear_int_ext(wilc, ENABLE_TX_VMM);
1088         if (ret)
1089                 goto out_release_bus;
1090
1091         ret = func->hif_block_tx_ext(wilc, 0, txb, offset);
1092
1093 out_release_bus:
1094         rv = release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
1095         if (!ret && rv)
1096                 ret = rv;
1097
1098 out_unlock:
1099         mutex_unlock(&wilc->txq_add_to_head_cs);
1100
1101 out_update_cnt:
1102         *txq_count = wilc->txq_entries;
1103         return ret;
1104 }
1105
1106 static void wilc_wlan_handle_rx_buff(struct wilc *wilc, u8 *buffer, int size)
1107 {
1108         int offset = 0;
1109         u32 header;
1110         u32 pkt_len, pkt_offset, tp_len;
1111         int is_cfg_packet;
1112         u8 *buff_ptr;
1113
1114         do {
1115                 buff_ptr = buffer + offset;
1116                 header = get_unaligned_le32(buff_ptr);
1117
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);
1122
1123                 if (pkt_len == 0 || tp_len == 0)
1124                         break;
1125
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;
1136
1137                                 buff_ptr += pkt_offset;
1138
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);
1147                                 }
1148                         }
1149                 }
1150                 offset += tp_len;
1151         } while (offset < size);
1152 }
1153
1154 static void wilc_wlan_handle_rxq(struct wilc *wilc)
1155 {
1156         int size;
1157         u8 *buffer;
1158         struct rxq_entry_t *rqe;
1159
1160         while (!wilc->quit) {
1161                 rqe = wilc_wlan_rxq_remove(wilc);
1162                 if (!rqe)
1163                         break;
1164
1165                 buffer = rqe->buffer;
1166                 size = rqe->buffer_size;
1167                 wilc_wlan_handle_rx_buff(wilc, buffer, size);
1168
1169                 kfree(rqe);
1170         }
1171         if (wilc->quit)
1172                 complete(&wilc->cfg_event);
1173 }
1174
1175 static void wilc_unknown_isr_ext(struct wilc *wilc)
1176 {
1177         wilc->hif_func->hif_clear_int_ext(wilc, 0);
1178 }
1179
1180 static void wilc_wlan_handle_isr_ext(struct wilc *wilc, u32 int_status)
1181 {
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;
1188
1189         size = FIELD_GET(WILC_INTERRUPT_DATA_SIZE, int_status) << 2;
1190
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++;
1195         }
1196
1197         if (size <= 0)
1198                 return;
1199
1200         if (WILC_RX_BUFF_SIZE - offset < size)
1201                 offset = 0;
1202
1203         buffer = &wilc->rx_buffer[offset];
1204
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;
1209
1210         offset += size;
1211         wilc->rx_buffer_offset = offset;
1212         rqe = kmalloc(sizeof(*rqe), GFP_KERNEL);
1213         if (!rqe)
1214                 return;
1215
1216         rqe->buffer = buffer;
1217         rqe->buffer_size = size;
1218         wilc_wlan_rxq_add(wilc, rqe);
1219         wilc_wlan_handle_rxq(wilc);
1220 }
1221
1222 void wilc_handle_isr(struct wilc *wilc)
1223 {
1224         u32 int_status;
1225         int ret;
1226
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;
1231         }
1232
1233         wilc->hif_func->hif_read_int(wilc, &int_status);
1234
1235         if (int_status & DATA_INT_EXT)
1236                 wilc_wlan_handle_isr_ext(wilc, int_status);
1237
1238         if (!(int_status & (ALL_INT_EXT)))
1239                 wilc_unknown_isr_ext(wilc);
1240
1241         ret = release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
1242         if (ret)
1243                 dev_err_ratelimited(wilc->dev, "Cannot release bus\n");
1244 }
1245 EXPORT_SYMBOL_GPL(wilc_handle_isr);
1246
1247 int wilc_wlan_firmware_download(struct wilc *wilc, const u8 *buffer,
1248                                 u32 buffer_size)
1249 {
1250         u32 offset;
1251         u32 addr, size, size2, blksz;
1252         u8 *dma_buffer;
1253         int ret = 0;
1254         u32 reg = 0;
1255         int rv;
1256
1257         blksz = BIT(12);
1258
1259         dma_buffer = kmalloc(blksz, GFP_KERNEL);
1260         if (!dma_buffer)
1261                 return -EIO;
1262
1263         offset = 0;
1264         pr_debug("%s: Downloading firmware size = %d\n", __func__, buffer_size);
1265
1266         ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
1267         if (ret)
1268                 return ret;
1269
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__);
1276
1277         ret = release_bus(wilc, WILC_BUS_RELEASE_ONLY);
1278         if (ret)
1279                 goto fail;
1280
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;
1287
1288                 offset += 8;
1289                 while (((int)size) && (offset < buffer_size)) {
1290                         if (size <= blksz)
1291                                 size2 = size;
1292                         else
1293                                 size2 = blksz;
1294
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;
1300
1301                         addr += size2;
1302                         offset += size2;
1303                         size -= size2;
1304                 }
1305                 rv = release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
1306                 if (!ret && rv)
1307                         ret = rv;
1308
1309                 if (ret) {
1310                         pr_err("%s Bus error\n", __func__);
1311                         goto fail;
1312                 }
1313                 pr_debug("%s Offset = %d\n", __func__, offset);
1314         } while (offset < buffer_size);
1315
1316 fail:
1317
1318         kfree(dma_buffer);
1319
1320         return ret;
1321 }
1322
1323 int wilc_wlan_start(struct wilc *wilc)
1324 {
1325         u32 reg = 0;
1326         int ret, rv;
1327         u32 chipid;
1328
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;
1334         }
1335         ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_ONLY);
1336         if (ret)
1337                 return ret;
1338
1339         ret = wilc->hif_func->hif_write_reg(wilc, WILC_VMM_CORE_CFG, reg);
1340         if (ret)
1341                 goto release;
1342
1343         reg = 0;
1344         if (wilc->io_type == WILC_HIF_SDIO && wilc->dev_irq_num)
1345                 reg |= WILC_HAVE_SDIO_IRQ_GPIO;
1346
1347         if (is_wilc3000(wilc->chipid))
1348                 reg |= WILC_HAVE_SLEEP_CLK_SRC_RTC;
1349
1350         ret = wilc->hif_func->hif_write_reg(wilc, WILC_GP_REG_1, reg);
1351         if (ret)
1352                 goto release;
1353
1354         wilc->hif_func->hif_sync_ext(wilc, NUM_INT_EXT);
1355
1356         ret = wilc->hif_func->hif_read_reg(wilc, WILC_CHIPID, &chipid);
1357         if (ret)
1358                 goto release;
1359
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);
1365         }
1366
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);
1370
1371 release:
1372         rv = release_bus(wilc, WILC_BUS_RELEASE_ONLY);
1373         return ret ? ret : rv;
1374 }
1375
1376 int wilc_wlan_stop(struct wilc *wilc, struct wilc_vif *vif)
1377 {
1378         u32 reg = 0;
1379         int ret, rv;
1380
1381         ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
1382         if (ret)
1383                 return ret;
1384
1385         ret = wilc->hif_func->hif_read_reg(wilc, GLOBAL_MODE_CONTROL, &reg);
1386         if (ret)
1387                 goto release;
1388
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;
1393
1394         ret = wilc->hif_func->hif_read_reg(wilc, PWR_SEQ_MISC_CTRL, &reg);
1395         if (ret)
1396                 goto release;
1397
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;
1402
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;
1407         }
1408
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;
1414         }
1415
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);
1420
1421         return ret ? ret : rv;
1422 }
1423
1424 void wilc_wlan_cleanup(struct net_device *dev)
1425 {
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;
1431
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);
1438                 }
1439         }
1440
1441         while ((rqe = wilc_wlan_rxq_remove(wilc)))
1442                 kfree(rqe);
1443
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);
1451 }
1452
1453 static int wilc_wlan_cfg_commit(struct wilc_vif *vif, int type,
1454                                 u32 drv_handler)
1455 {
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);
1459
1460         if (type == WILC_CFG_SET)
1461                 cfg->hdr.cmd_type = 'W';
1462         else
1463                 cfg->hdr.cmd_type = 'Q';
1464
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;
1469
1470         if (!wilc_wlan_txq_add_cfg_pkt(vif, (u8 *)&cfg->hdr, t_len))
1471                 return -1;
1472
1473         return 0;
1474 }
1475
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)
1478 {
1479         u32 offset;
1480         int ret_size;
1481         struct wilc *wilc = vif->wilc;
1482
1483         mutex_lock(&wilc->cfg_cmd_lock);
1484
1485         if (start)
1486                 wilc->cfg_frame_offset = 0;
1487
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;
1493
1494         if (!commit) {
1495                 mutex_unlock(&wilc->cfg_cmd_lock);
1496                 return ret_size;
1497         }
1498
1499         netdev_dbg(vif->ndev, "%s: seqno[%d]\n", __func__, wilc->cfg_seq_no);
1500
1501         if (wilc_wlan_cfg_commit(vif, WILC_CFG_SET, drv_handler))
1502                 ret_size = 0;
1503
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;
1508         }
1509
1510         wilc->cfg_frame_offset = 0;
1511         wilc->cfg_seq_no += 1;
1512         mutex_unlock(&wilc->cfg_cmd_lock);
1513
1514         return ret_size;
1515 }
1516
1517 int wilc_wlan_cfg_get(struct wilc_vif *vif, int start, u16 wid, int commit,
1518                       u32 drv_handler)
1519 {
1520         u32 offset;
1521         int ret_size;
1522         struct wilc *wilc = vif->wilc;
1523
1524         mutex_lock(&wilc->cfg_cmd_lock);
1525
1526         if (start)
1527                 wilc->cfg_frame_offset = 0;
1528
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;
1533
1534         if (!commit) {
1535                 mutex_unlock(&wilc->cfg_cmd_lock);
1536                 return ret_size;
1537         }
1538
1539         if (wilc_wlan_cfg_commit(vif, WILC_CFG_QUERY, drv_handler))
1540                 ret_size = 0;
1541
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;
1546         }
1547         wilc->cfg_frame_offset = 0;
1548         wilc->cfg_seq_no += 1;
1549         mutex_unlock(&wilc->cfg_cmd_lock);
1550
1551         return ret_size;
1552 }
1553
1554 int wilc_send_config_pkt(struct wilc_vif *vif, u8 mode, struct wid *wids,
1555                          u32 count)
1556 {
1557         int i;
1558         int ret = 0;
1559         u32 drv = wilc_get_vif_idx(vif);
1560
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;
1569                         }
1570                 }
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);
1576                 }
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;
1587                         }
1588                 }
1589         }
1590
1591         return ret;
1592 }
1593
1594 int wilc_get_chipid(struct wilc *wilc)
1595 {
1596         u32 chipid = 0;
1597         u32 rfrevid = 0;
1598
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);
1605
1606                         if (!is_wilc1000(chipid)) {
1607                                 wilc->chipid = 0;
1608                                 return -EINVAL;
1609                         }
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;
1618                         }
1619                 }
1620
1621                 wilc->chipid = chipid;
1622         }
1623
1624         return 0;
1625 }
1626 EXPORT_SYMBOL_GPL(wilc_get_chipid);
1627
1628 static int init_chip(struct net_device *dev)
1629 {
1630         u32 reg;
1631         int ret, rv;
1632         struct wilc_vif *vif = netdev_priv(dev);
1633         struct wilc *wilc = vif->wilc;
1634
1635         ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
1636         if (ret)
1637                 return ret;
1638
1639         ret = wilc_get_chipid(wilc);
1640         if (ret)
1641                 goto release;
1642
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;
1650                 }
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;
1658                 }
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;
1665                 }
1666         }
1667
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;
1673                 }
1674
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;
1680                 }
1681         }
1682
1683 release:
1684         rv = release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
1685
1686         return ret ? ret : rv;
1687 }
1688
1689 int wilc_load_mac_from_nv(struct wilc *wl)
1690 {
1691         int ret, rv;
1692         unsigned int i;
1693
1694         ret = acquire_bus(wl, WILC_BUS_ACQUIRE_AND_WAKEUP);
1695         if (ret)
1696                 return ret;
1697
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;
1703
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;
1710                 }
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;
1717                 }
1718
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;
1723
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);
1730
1731                 ret = 0;
1732                 break;
1733         }
1734
1735         rv = release_bus(wl, WILC_BUS_RELEASE_ALLOW_SLEEP);
1736         return ret ? ret : rv;
1737 }
1738 EXPORT_SYMBOL_GPL(wilc_load_mac_from_nv);
1739
1740 int wilc_wlan_init(struct net_device *dev)
1741 {
1742         int ret = 0, rv;
1743         struct wilc_vif *vif = netdev_priv(dev);
1744         struct wilc *wilc;
1745
1746         wilc = vif->wilc;
1747
1748         wilc->quit = 0;
1749
1750         if (!wilc->hif_func->hif_is_init(wilc)) {
1751                 ret = acquire_bus(wilc, WILC_BUS_ACQUIRE_ONLY);
1752                 if (ret)
1753                         return ret;
1754
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;
1763
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;
1768                 }
1769
1770                 netdev_dbg(dev, "chipid (%08x)\n", wilc->chipid);
1771         }
1772
1773         if (!wilc->vmm_table)
1774                 wilc->vmm_table = kcalloc(WILC_VMM_TBL_SIZE, sizeof(u32), GFP_KERNEL);
1775
1776         if (!wilc->vmm_table) {
1777                 ret = -ENOBUFS;
1778                 goto fail;
1779         }
1780
1781         if (!wilc->tx_buffer)
1782                 wilc->tx_buffer = kmalloc(WILC_TX_BUFF_SIZE, GFP_KERNEL);
1783
1784         if (!wilc->tx_buffer) {
1785                 ret = -ENOBUFS;
1786                 goto fail;
1787         }
1788
1789         if (!wilc->rx_buffer)
1790                 wilc->rx_buffer = kmalloc(WILC_RX_BUFF_SIZE, GFP_KERNEL);
1791
1792         if (!wilc->rx_buffer) {
1793                 ret = -ENOBUFS;
1794                 goto fail;
1795         }
1796
1797         if (init_chip(dev)) {
1798                 ret = -EIO;
1799                 goto fail;
1800         }
1801
1802         return 0;
1803
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;
1811
1812         return ret;
1813 }
This page took 0.148172 seconds and 4 git commands to generate.