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