1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * Copyright (C) 2021-2022 Intel Corporation
4 */
5
6 #include <linux/etherdevice.h>
7 #include <linux/netdevice.h>
8 #include <linux/ieee80211.h>
9 #include <linux/rtnetlink.h>
10 #include <linux/module.h>
11 #include <linux/moduleparam.h>
12 #include <linux/mei_cl_bus.h>
13 #include <linux/rcupdate.h>
14 #include <linux/debugfs.h>
15 #include <linux/skbuff.h>
16 #include <linux/wait.h>
17 #include <linux/slab.h>
18 #include <linux/mm.h>
19
20 #include <net/cfg80211.h>
21
22 #include "internal.h"
23 #include "iwl-mei.h"
24 #include "trace.h"
25 #include "trace-data.h"
26 #include "sap.h"
27
28 MODULE_DESCRIPTION("The Intel(R) wireless / CSME firmware interface");
29 MODULE_LICENSE("GPL");
30
31 #define MEI_WLAN_UUID UUID_LE(0x13280904, 0x7792, 0x4fcb, \
32 0xa1, 0xaa, 0x5e, 0x70, 0xcb, 0xb1, 0xe8, 0x65)
33
34 /*
35 * Since iwlwifi calls iwlmei without any context, hold a pointer to the
36 * mei_cl_device structure here.
37 * Define a mutex that will synchronize all the flows between iwlwifi and
38 * iwlmei.
39 * Note that iwlmei can't have several instances, so it ok to have static
40 * variables here.
41 */
42 static struct mei_cl_device *iwl_mei_global_cldev;
43 static DEFINE_MUTEX(iwl_mei_mutex);
44 static unsigned long iwl_mei_status;
45
46 enum iwl_mei_status_bits {
47 IWL_MEI_STATUS_SAP_CONNECTED,
48 };
49
iwl_mei_is_connected(void)50 bool iwl_mei_is_connected(void)
51 {
52 return test_bit(IWL_MEI_STATUS_SAP_CONNECTED, &iwl_mei_status);
53 }
54 EXPORT_SYMBOL_GPL(iwl_mei_is_connected);
55
56 #define SAP_VERSION 3
57 #define SAP_CONTROL_BLOCK_ID 0x21504153 /* SAP! in ASCII */
58
59 struct iwl_sap_q_ctrl_blk {
60 __le32 wr_ptr;
61 __le32 rd_ptr;
62 __le32 size;
63 };
64
65 enum iwl_sap_q_idx {
66 SAP_QUEUE_IDX_NOTIF = 0,
67 SAP_QUEUE_IDX_DATA,
68 SAP_QUEUE_IDX_MAX,
69 };
70
71 struct iwl_sap_dir {
72 __le32 reserved;
73 struct iwl_sap_q_ctrl_blk q_ctrl_blk[SAP_QUEUE_IDX_MAX];
74 };
75
76 enum iwl_sap_dir_idx {
77 SAP_DIRECTION_HOST_TO_ME = 0,
78 SAP_DIRECTION_ME_TO_HOST,
79 SAP_DIRECTION_MAX,
80 };
81
82 struct iwl_sap_shared_mem_ctrl_blk {
83 __le32 sap_id;
84 __le32 size;
85 struct iwl_sap_dir dir[SAP_DIRECTION_MAX];
86 };
87
88 /*
89 * The shared area has the following layout:
90 *
91 * +-----------------------------------+
92 * |struct iwl_sap_shared_mem_ctrl_blk |
93 * +-----------------------------------+
94 * |Host -> ME data queue |
95 * +-----------------------------------+
96 * |Host -> ME notif queue |
97 * +-----------------------------------+
98 * |ME -> Host data queue |
99 * +-----------------------------------+
100 * |ME -> host notif queue |
101 * +-----------------------------------+
102 * |SAP control block id (SAP!) |
103 * +-----------------------------------+
104 */
105
106 #define SAP_H2M_DATA_Q_SZ 48256
107 #define SAP_M2H_DATA_Q_SZ 24128
108 #define SAP_H2M_NOTIF_Q_SZ 2240
109 #define SAP_M2H_NOTIF_Q_SZ 62720
110
111 #define _IWL_MEI_SAP_SHARED_MEM_SZ \
112 (sizeof(struct iwl_sap_shared_mem_ctrl_blk) + \
113 SAP_H2M_DATA_Q_SZ + SAP_H2M_NOTIF_Q_SZ + \
114 SAP_M2H_DATA_Q_SZ + SAP_M2H_NOTIF_Q_SZ + 4)
115
116 #define IWL_MEI_SAP_SHARED_MEM_SZ \
117 (roundup(_IWL_MEI_SAP_SHARED_MEM_SZ, PAGE_SIZE))
118
119 struct iwl_mei_shared_mem_ptrs {
120 struct iwl_sap_shared_mem_ctrl_blk *ctrl;
121 void *q_head[SAP_DIRECTION_MAX][SAP_QUEUE_IDX_MAX];
122 size_t q_size[SAP_DIRECTION_MAX][SAP_QUEUE_IDX_MAX];
123 };
124
125 struct iwl_mei_filters {
126 struct rcu_head rcu_head;
127 struct iwl_sap_oob_filters filters;
128 };
129
130 /**
131 * struct iwl_mei - holds the private date for iwl_mei
132 *
133 * @get_nvm_wq: the wait queue for the get_nvm flow
134 * @send_csa_msg_wk: used to defer the transmission of the CHECK_SHARED_AREA
135 * message. Used so that we can send CHECK_SHARED_AREA from atomic
136 * contexts.
137 * @get_ownership_wq: the wait queue for the get_ownership_flow
138 * @shared_mem: the memory that is shared between CSME and the host
139 * @cldev: the pointer to the MEI client device
140 * @nvm: the data returned by the CSME for the NVM
141 * @filters: the filters sent by CSME
142 * @got_ownership: true if we own the device
143 * @amt_enabled: true if CSME has wireless enabled
144 * @csa_throttled: when true, we can't send CHECK_SHARED_AREA over the MEI
145 * bus, but rather need to wait until send_csa_msg_wk runs
146 * @csme_taking_ownership: true when CSME is taking ownership. Used to remember
147 * to send CSME_OWNERSHIP_CONFIRMED when the driver completes its down
148 * flow.
149 * @link_prot_state: true when we are in link protection PASSIVE
150 * @csa_throttle_end_wk: used when &csa_throttled is true
151 * @data_q_lock: protects the access to the data queues which are
152 * accessed without the mutex.
153 * @sap_seq_no: the sequence number for the SAP messages
154 * @seq_no: the sequence number for the SAP messages
155 * @dbgfs_dir: the debugfs dir entry
156 */
157 struct iwl_mei {
158 wait_queue_head_t get_nvm_wq;
159 struct work_struct send_csa_msg_wk;
160 wait_queue_head_t get_ownership_wq;
161 struct iwl_mei_shared_mem_ptrs shared_mem;
162 struct mei_cl_device *cldev;
163 struct iwl_mei_nvm *nvm;
164 struct iwl_mei_filters __rcu *filters;
165 bool got_ownership;
166 bool amt_enabled;
167 bool csa_throttled;
168 bool csme_taking_ownership;
169 bool link_prot_state;
170 struct delayed_work csa_throttle_end_wk;
171 spinlock_t data_q_lock;
172
173 atomic_t sap_seq_no;
174 atomic_t seq_no;
175
176 struct dentry *dbgfs_dir;
177 };
178
179 /**
180 * struct iwl_mei_cache - cache for the parameters from iwlwifi
181 * @ops: Callbacks to iwlwifi.
182 * @netdev: The netdev that will be used to transmit / receive packets.
183 * @conn_info: The connection info message triggered by iwlwifi's association.
184 * @power_limit: pointer to an array of 10 elements (le16) represents the power
185 * restrictions per chain.
186 * @rf_kill: rf kill state.
187 * @mcc: MCC info
188 * @mac_address: interface MAC address.
189 * @nvm_address: NVM MAC address.
190 * @priv: A pointer to iwlwifi.
191 *
192 * This used to cache the configurations coming from iwlwifi's way. The data
193 * is cached here so that we can buffer the configuration even if we don't have
194 * a bind from the mei bus and hence, on iwl_mei structure.
195 */
196 struct iwl_mei_cache {
197 const struct iwl_mei_ops *ops;
198 struct net_device __rcu *netdev;
199 const struct iwl_sap_notif_connection_info *conn_info;
200 const __le16 *power_limit;
201 u32 rf_kill;
202 u16 mcc;
203 u8 mac_address[6];
204 u8 nvm_address[6];
205 void *priv;
206 };
207
208 static struct iwl_mei_cache iwl_mei_cache = {
209 .rf_kill = SAP_HW_RFKILL_DEASSERTED | SAP_SW_RFKILL_DEASSERTED
210 };
211
iwl_mei_free_shared_mem(struct mei_cl_device * cldev)212 static void iwl_mei_free_shared_mem(struct mei_cl_device *cldev)
213 {
214 struct iwl_mei *mei = mei_cldev_get_drvdata(cldev);
215
216 if (mei_cldev_dma_unmap(cldev))
217 dev_err(&cldev->dev, "Couldn't unmap the shared mem properly\n");
218 memset(&mei->shared_mem, 0, sizeof(mei->shared_mem));
219 }
220
221 #define HBM_DMA_BUF_ID_WLAN 1
222
iwl_mei_alloc_shared_mem(struct mei_cl_device * cldev)223 static int iwl_mei_alloc_shared_mem(struct mei_cl_device *cldev)
224 {
225 struct iwl_mei *mei = mei_cldev_get_drvdata(cldev);
226 struct iwl_mei_shared_mem_ptrs *mem = &mei->shared_mem;
227
228 mem->ctrl = mei_cldev_dma_map(cldev, HBM_DMA_BUF_ID_WLAN,
229 IWL_MEI_SAP_SHARED_MEM_SZ);
230
231 if (IS_ERR(mem->ctrl)) {
232 int ret = PTR_ERR(mem->ctrl);
233
234 mem->ctrl = NULL;
235
236 return ret;
237 }
238
239 memset(mem->ctrl, 0, IWL_MEI_SAP_SHARED_MEM_SZ);
240
241 return 0;
242 }
243
iwl_mei_init_shared_mem(struct iwl_mei * mei)244 static void iwl_mei_init_shared_mem(struct iwl_mei *mei)
245 {
246 struct iwl_mei_shared_mem_ptrs *mem = &mei->shared_mem;
247 struct iwl_sap_dir *h2m;
248 struct iwl_sap_dir *m2h;
249 int dir, queue;
250 u8 *q_head;
251
252 mem->ctrl->sap_id = cpu_to_le32(SAP_CONTROL_BLOCK_ID);
253
254 mem->ctrl->size = cpu_to_le32(sizeof(*mem->ctrl));
255
256 h2m = &mem->ctrl->dir[SAP_DIRECTION_HOST_TO_ME];
257 m2h = &mem->ctrl->dir[SAP_DIRECTION_ME_TO_HOST];
258
259 h2m->q_ctrl_blk[SAP_QUEUE_IDX_DATA].size =
260 cpu_to_le32(SAP_H2M_DATA_Q_SZ);
261 h2m->q_ctrl_blk[SAP_QUEUE_IDX_NOTIF].size =
262 cpu_to_le32(SAP_H2M_NOTIF_Q_SZ);
263 m2h->q_ctrl_blk[SAP_QUEUE_IDX_DATA].size =
264 cpu_to_le32(SAP_M2H_DATA_Q_SZ);
265 m2h->q_ctrl_blk[SAP_QUEUE_IDX_NOTIF].size =
266 cpu_to_le32(SAP_M2H_NOTIF_Q_SZ);
267
268 /* q_head points to the start of the first queue */
269 q_head = (void *)(mem->ctrl + 1);
270
271 /* Initialize the queue heads */
272 for (dir = 0; dir < SAP_DIRECTION_MAX; dir++) {
273 for (queue = 0; queue < SAP_QUEUE_IDX_MAX; queue++) {
274 mem->q_head[dir][queue] = q_head;
275 q_head +=
276 le32_to_cpu(mem->ctrl->dir[dir].q_ctrl_blk[queue].size);
277 mem->q_size[dir][queue] =
278 le32_to_cpu(mem->ctrl->dir[dir].q_ctrl_blk[queue].size);
279 }
280 }
281
282 *(__le32 *)q_head = cpu_to_le32(SAP_CONTROL_BLOCK_ID);
283 }
284
iwl_mei_write_cyclic_buf(struct mei_cl_device * cldev,struct iwl_sap_q_ctrl_blk * notif_q,u8 * q_head,const struct iwl_sap_hdr * hdr,u32 q_sz)285 static ssize_t iwl_mei_write_cyclic_buf(struct mei_cl_device *cldev,
286 struct iwl_sap_q_ctrl_blk *notif_q,
287 u8 *q_head,
288 const struct iwl_sap_hdr *hdr,
289 u32 q_sz)
290 {
291 u32 rd = le32_to_cpu(READ_ONCE(notif_q->rd_ptr));
292 u32 wr = le32_to_cpu(READ_ONCE(notif_q->wr_ptr));
293 size_t room_in_buf;
294 size_t tx_sz = sizeof(*hdr) + le16_to_cpu(hdr->len);
295
296 if (rd > q_sz || wr > q_sz) {
297 dev_err(&cldev->dev,
298 "Pointers are past the end of the buffer\n");
299 return -EINVAL;
300 }
301
302 room_in_buf = wr >= rd ? q_sz - wr + rd : rd - wr;
303
304 /* we don't have enough room for the data to write */
305 if (room_in_buf < tx_sz) {
306 dev_err(&cldev->dev,
307 "Not enough room in the buffer\n");
308 return -ENOSPC;
309 }
310
311 if (wr + tx_sz <= q_sz) {
312 memcpy(q_head + wr, hdr, tx_sz);
313 } else {
314 memcpy(q_head + wr, hdr, q_sz - wr);
315 memcpy(q_head, (const u8 *)hdr + q_sz - wr, tx_sz - (q_sz - wr));
316 }
317
318 WRITE_ONCE(notif_q->wr_ptr, cpu_to_le32((wr + tx_sz) % q_sz));
319 return 0;
320 }
321
iwl_mei_host_to_me_data_pending(const struct iwl_mei * mei)322 static bool iwl_mei_host_to_me_data_pending(const struct iwl_mei *mei)
323 {
324 struct iwl_sap_q_ctrl_blk *notif_q;
325 struct iwl_sap_dir *dir;
326
327 dir = &mei->shared_mem.ctrl->dir[SAP_DIRECTION_HOST_TO_ME];
328 notif_q = &dir->q_ctrl_blk[SAP_QUEUE_IDX_DATA];
329
330 if (READ_ONCE(notif_q->wr_ptr) != READ_ONCE(notif_q->rd_ptr))
331 return true;
332
333 notif_q = &dir->q_ctrl_blk[SAP_QUEUE_IDX_NOTIF];
334 return READ_ONCE(notif_q->wr_ptr) != READ_ONCE(notif_q->rd_ptr);
335 }
336
iwl_mei_send_check_shared_area(struct mei_cl_device * cldev)337 static int iwl_mei_send_check_shared_area(struct mei_cl_device *cldev)
338 {
339 struct iwl_mei *mei = mei_cldev_get_drvdata(cldev);
340 struct iwl_sap_me_msg_start msg = {
341 .hdr.type = cpu_to_le32(SAP_ME_MSG_CHECK_SHARED_AREA),
342 .hdr.seq_num = cpu_to_le32(atomic_inc_return(&mei->seq_no)),
343 };
344 int ret;
345
346 lockdep_assert_held(&iwl_mei_mutex);
347
348 if (mei->csa_throttled)
349 return 0;
350
351 trace_iwlmei_me_msg(&msg.hdr, true);
352 ret = mei_cldev_send(cldev, (void *)&msg, sizeof(msg));
353 if (ret != sizeof(msg)) {
354 dev_err(&cldev->dev,
355 "failed to send the SAP_ME_MSG_CHECK_SHARED_AREA message %d\n",
356 ret);
357 return ret;
358 }
359
360 mei->csa_throttled = true;
361
362 schedule_delayed_work(&mei->csa_throttle_end_wk,
363 msecs_to_jiffies(100));
364
365 return 0;
366 }
367
iwl_mei_csa_throttle_end_wk(struct work_struct * wk)368 static void iwl_mei_csa_throttle_end_wk(struct work_struct *wk)
369 {
370 struct iwl_mei *mei =
371 container_of(wk, struct iwl_mei, csa_throttle_end_wk.work);
372
373 mutex_lock(&iwl_mei_mutex);
374
375 mei->csa_throttled = false;
376
377 if (iwl_mei_host_to_me_data_pending(mei))
378 iwl_mei_send_check_shared_area(mei->cldev);
379
380 mutex_unlock(&iwl_mei_mutex);
381 }
382
iwl_mei_send_sap_msg_payload(struct mei_cl_device * cldev,struct iwl_sap_hdr * hdr)383 static int iwl_mei_send_sap_msg_payload(struct mei_cl_device *cldev,
384 struct iwl_sap_hdr *hdr)
385 {
386 struct iwl_mei *mei = mei_cldev_get_drvdata(cldev);
387 struct iwl_sap_q_ctrl_blk *notif_q;
388 struct iwl_sap_dir *dir;
389 void *q_head;
390 u32 q_sz;
391 int ret;
392
393 lockdep_assert_held(&iwl_mei_mutex);
394
395 if (!mei->shared_mem.ctrl) {
396 dev_err(&cldev->dev,
397 "No shared memory, can't send any SAP message\n");
398 return -EINVAL;
399 }
400
401 if (!iwl_mei_is_connected()) {
402 dev_err(&cldev->dev,
403 "Can't send a SAP message if we're not connected\n");
404 return -ENODEV;
405 }
406
407 hdr->seq_num = cpu_to_le32(atomic_inc_return(&mei->sap_seq_no));
408 dev_dbg(&cldev->dev, "Sending %d\n", hdr->type);
409
410 dir = &mei->shared_mem.ctrl->dir[SAP_DIRECTION_HOST_TO_ME];
411 notif_q = &dir->q_ctrl_blk[SAP_QUEUE_IDX_NOTIF];
412 q_head = mei->shared_mem.q_head[SAP_DIRECTION_HOST_TO_ME][SAP_QUEUE_IDX_NOTIF];
413 q_sz = mei->shared_mem.q_size[SAP_DIRECTION_HOST_TO_ME][SAP_QUEUE_IDX_NOTIF];
414 ret = iwl_mei_write_cyclic_buf(q_head, notif_q, q_head, hdr, q_sz);
415
416 if (ret < 0)
417 return ret;
418
419 trace_iwlmei_sap_cmd(hdr, true);
420
421 return iwl_mei_send_check_shared_area(cldev);
422 }
423
iwl_mei_add_data_to_ring(struct sk_buff * skb,bool cb_tx)424 void iwl_mei_add_data_to_ring(struct sk_buff *skb, bool cb_tx)
425 {
426 struct iwl_sap_q_ctrl_blk *notif_q;
427 struct iwl_sap_dir *dir;
428 struct iwl_mei *mei;
429 size_t room_in_buf;
430 size_t tx_sz;
431 size_t hdr_sz;
432 u32 q_sz;
433 u32 rd;
434 u32 wr;
435 u8 *q_head;
436
437 if (!iwl_mei_global_cldev)
438 return;
439
440 mei = mei_cldev_get_drvdata(iwl_mei_global_cldev);
441
442 /*
443 * We access this path for Rx packets (the more common case)
444 * and from Tx path when we send DHCP packets, the latter is
445 * very unlikely.
446 * Take the lock already here to make sure we see that remove()
447 * might have cleared the IWL_MEI_STATUS_SAP_CONNECTED bit.
448 */
449 spin_lock_bh(&mei->data_q_lock);
450
451 if (!iwl_mei_is_connected()) {
452 spin_unlock_bh(&mei->data_q_lock);
453 return;
454 }
455
456 /*
457 * We are in a RCU critical section and the remove from the CSME bus
458 * which would free this memory waits for the readers to complete (this
459 * is done in netdev_rx_handler_unregister).
460 */
461 dir = &mei->shared_mem.ctrl->dir[SAP_DIRECTION_HOST_TO_ME];
462 notif_q = &dir->q_ctrl_blk[SAP_QUEUE_IDX_DATA];
463 q_head = mei->shared_mem.q_head[SAP_DIRECTION_HOST_TO_ME][SAP_QUEUE_IDX_DATA];
464 q_sz = mei->shared_mem.q_size[SAP_DIRECTION_HOST_TO_ME][SAP_QUEUE_IDX_DATA];
465
466 rd = le32_to_cpu(READ_ONCE(notif_q->rd_ptr));
467 wr = le32_to_cpu(READ_ONCE(notif_q->wr_ptr));
468 hdr_sz = cb_tx ? sizeof(struct iwl_sap_cb_data) :
469 sizeof(struct iwl_sap_hdr);
470 tx_sz = skb->len + hdr_sz;
471
472 if (rd > q_sz || wr > q_sz) {
473 dev_err(&mei->cldev->dev,
474 "can't write the data: pointers are past the end of the buffer\n");
475 goto out;
476 }
477
478 room_in_buf = wr >= rd ? q_sz - wr + rd : rd - wr;
479
480 /* we don't have enough room for the data to write */
481 if (room_in_buf < tx_sz) {
482 dev_err(&mei->cldev->dev,
483 "Not enough room in the buffer for this data\n");
484 goto out;
485 }
486
487 if (skb_headroom(skb) < hdr_sz) {
488 dev_err(&mei->cldev->dev,
489 "Not enough headroom in the skb to write the SAP header\n");
490 goto out;
491 }
492
493 if (cb_tx) {
494 struct iwl_sap_cb_data *cb_hdr = skb_push(skb, sizeof(*cb_hdr));
495
496 memset(cb_hdr, 0, sizeof(*cb_hdr));
497 cb_hdr->hdr.type = cpu_to_le16(SAP_MSG_CB_DATA_PACKET);
498 cb_hdr->hdr.len = cpu_to_le16(skb->len - sizeof(cb_hdr->hdr));
499 cb_hdr->hdr.seq_num = cpu_to_le32(atomic_inc_return(&mei->sap_seq_no));
500 cb_hdr->to_me_filt_status = cpu_to_le32(BIT(CB_TX_DHCP_FILT_IDX));
501 cb_hdr->data_len = cpu_to_le32(skb->len - sizeof(*cb_hdr));
502 trace_iwlmei_sap_data(skb, IWL_SAP_TX_DHCP);
503 } else {
504 struct iwl_sap_hdr *hdr = skb_push(skb, sizeof(*hdr));
505
506 hdr->type = cpu_to_le16(SAP_MSG_DATA_PACKET);
507 hdr->len = cpu_to_le16(skb->len - sizeof(*hdr));
508 hdr->seq_num = cpu_to_le32(atomic_inc_return(&mei->sap_seq_no));
509 trace_iwlmei_sap_data(skb, IWL_SAP_TX_DATA_FROM_AIR);
510 }
511
512 if (wr + tx_sz <= q_sz) {
513 skb_copy_bits(skb, 0, q_head + wr, tx_sz);
514 } else {
515 skb_copy_bits(skb, 0, q_head + wr, q_sz - wr);
516 skb_copy_bits(skb, q_sz - wr, q_head, tx_sz - (q_sz - wr));
517 }
518
519 WRITE_ONCE(notif_q->wr_ptr, cpu_to_le32((wr + tx_sz) % q_sz));
520
521 out:
522 spin_unlock_bh(&mei->data_q_lock);
523 }
524
525 static int
iwl_mei_send_sap_msg(struct mei_cl_device * cldev,u16 type)526 iwl_mei_send_sap_msg(struct mei_cl_device *cldev, u16 type)
527 {
528 struct iwl_sap_hdr msg = {
529 .type = cpu_to_le16(type),
530 };
531
532 return iwl_mei_send_sap_msg_payload(cldev, &msg);
533 }
534
iwl_mei_send_csa_msg_wk(struct work_struct * wk)535 static void iwl_mei_send_csa_msg_wk(struct work_struct *wk)
536 {
537 struct iwl_mei *mei =
538 container_of(wk, struct iwl_mei, send_csa_msg_wk);
539
540 if (!iwl_mei_is_connected())
541 return;
542
543 mutex_lock(&iwl_mei_mutex);
544
545 iwl_mei_send_check_shared_area(mei->cldev);
546
547 mutex_unlock(&iwl_mei_mutex);
548 }
549
550 /* Called in a RCU read critical section from netif_receive_skb */
iwl_mei_rx_handler(struct sk_buff ** pskb)551 static rx_handler_result_t iwl_mei_rx_handler(struct sk_buff **pskb)
552 {
553 struct sk_buff *skb = *pskb;
554 struct iwl_mei *mei =
555 rcu_dereference(skb->dev->rx_handler_data);
556 struct iwl_mei_filters *filters = rcu_dereference(mei->filters);
557 bool rx_for_csme = false;
558 rx_handler_result_t res;
559
560 /*
561 * remove() unregisters this handler and synchronize_net, so this
562 * should never happen.
563 */
564 if (!iwl_mei_is_connected()) {
565 dev_err(&mei->cldev->dev,
566 "Got an Rx packet, but we're not connected to SAP?\n");
567 return RX_HANDLER_PASS;
568 }
569
570 if (filters)
571 res = iwl_mei_rx_filter(skb, &filters->filters, &rx_for_csme);
572 else
573 res = RX_HANDLER_PASS;
574
575 /*
576 * The data is already on the ring of the shared area, all we
577 * need to do is to tell the CSME firmware to check what we have
578 * there.
579 */
580 if (rx_for_csme)
581 schedule_work(&mei->send_csa_msg_wk);
582
583 if (res != RX_HANDLER_PASS) {
584 trace_iwlmei_sap_data(skb, IWL_SAP_RX_DATA_DROPPED_FROM_AIR);
585 dev_kfree_skb(skb);
586 }
587
588 return res;
589 }
590
591 static void
iwl_mei_handle_rx_start_ok(struct mei_cl_device * cldev,const struct iwl_sap_me_msg_start_ok * rsp,ssize_t len)592 iwl_mei_handle_rx_start_ok(struct mei_cl_device *cldev,
593 const struct iwl_sap_me_msg_start_ok *rsp,
594 ssize_t len)
595 {
596 struct iwl_mei *mei = mei_cldev_get_drvdata(cldev);
597
598 if (len != sizeof(*rsp)) {
599 dev_err(&cldev->dev,
600 "got invalid SAP_ME_MSG_START_OK from CSME firmware\n");
601 dev_err(&cldev->dev,
602 "size is incorrect: %zd instead of %zu\n",
603 len, sizeof(*rsp));
604 return;
605 }
606
607 if (rsp->supported_version != SAP_VERSION) {
608 dev_err(&cldev->dev,
609 "didn't get the expected version: got %d\n",
610 rsp->supported_version);
611 return;
612 }
613
614 mutex_lock(&iwl_mei_mutex);
615 set_bit(IWL_MEI_STATUS_SAP_CONNECTED, &iwl_mei_status);
616 /* wifi driver has registered already */
617 if (iwl_mei_cache.ops) {
618 iwl_mei_send_sap_msg(mei->cldev,
619 SAP_MSG_NOTIF_WIFIDR_UP);
620 iwl_mei_cache.ops->sap_connected(iwl_mei_cache.priv);
621 }
622
623 mutex_unlock(&iwl_mei_mutex);
624 }
625
iwl_mei_handle_csme_filters(struct mei_cl_device * cldev,const struct iwl_sap_csme_filters * filters)626 static void iwl_mei_handle_csme_filters(struct mei_cl_device *cldev,
627 const struct iwl_sap_csme_filters *filters)
628 {
629 struct iwl_mei *mei = mei_cldev_get_drvdata(iwl_mei_global_cldev);
630 struct iwl_mei_filters *new_filters;
631 struct iwl_mei_filters *old_filters;
632
633 old_filters =
634 rcu_dereference_protected(mei->filters,
635 lockdep_is_held(&iwl_mei_mutex));
636
637 new_filters = kzalloc(sizeof(*new_filters), GFP_KERNEL);
638 if (!new_filters)
639 return;
640
641 /* Copy the OOB filters */
642 new_filters->filters = filters->filters;
643
644 rcu_assign_pointer(mei->filters, new_filters);
645
646 if (old_filters)
647 kfree_rcu(old_filters, rcu_head);
648 }
649
650 static void
iwl_mei_handle_conn_status(struct mei_cl_device * cldev,const struct iwl_sap_notif_conn_status * status)651 iwl_mei_handle_conn_status(struct mei_cl_device *cldev,
652 const struct iwl_sap_notif_conn_status *status)
653 {
654 struct iwl_mei *mei = mei_cldev_get_drvdata(cldev);
655 struct iwl_mei_conn_info conn_info = {
656 .lp_state = le32_to_cpu(status->link_prot_state),
657 .ssid_len = le32_to_cpu(status->conn_info.ssid_len),
658 .channel = status->conn_info.channel,
659 .band = status->conn_info.band,
660 .auth_mode = le32_to_cpu(status->conn_info.auth_mode),
661 .pairwise_cipher = le32_to_cpu(status->conn_info.pairwise_cipher),
662 };
663
664 if (!iwl_mei_cache.ops ||
665 conn_info.ssid_len > ARRAY_SIZE(conn_info.ssid))
666 return;
667
668 memcpy(conn_info.ssid, status->conn_info.ssid, conn_info.ssid_len);
669 ether_addr_copy(conn_info.bssid, status->conn_info.bssid);
670
671 iwl_mei_cache.ops->me_conn_status(iwl_mei_cache.priv, &conn_info);
672
673 mei->link_prot_state = status->link_prot_state;
674
675 /*
676 * Update the Rfkill state in case the host does not own the device:
677 * if we are in Link Protection, ask to not touch the device, else,
678 * unblock rfkill.
679 * If the host owns the device, inform the user space whether it can
680 * roam.
681 */
682 if (mei->got_ownership)
683 iwl_mei_cache.ops->roaming_forbidden(iwl_mei_cache.priv,
684 status->link_prot_state);
685 else
686 iwl_mei_cache.ops->rfkill(iwl_mei_cache.priv,
687 status->link_prot_state);
688 }
689
iwl_mei_set_init_conf(struct iwl_mei * mei)690 static void iwl_mei_set_init_conf(struct iwl_mei *mei)
691 {
692 struct iwl_sap_notif_host_link_up link_msg = {
693 .hdr.type = cpu_to_le16(SAP_MSG_NOTIF_HOST_LINK_UP),
694 .hdr.len = cpu_to_le16(sizeof(link_msg) - sizeof(link_msg.hdr)),
695 };
696 struct iwl_sap_notif_country_code mcc_msg = {
697 .hdr.type = cpu_to_le16(SAP_MSG_NOTIF_COUNTRY_CODE),
698 .hdr.len = cpu_to_le16(sizeof(mcc_msg) - sizeof(mcc_msg.hdr)),
699 .mcc = cpu_to_le16(iwl_mei_cache.mcc),
700 };
701 struct iwl_sap_notif_sar_limits sar_msg = {
702 .hdr.type = cpu_to_le16(SAP_MSG_NOTIF_SAR_LIMITS),
703 .hdr.len = cpu_to_le16(sizeof(sar_msg) - sizeof(sar_msg.hdr)),
704 };
705 struct iwl_sap_notif_host_nic_info nic_info_msg = {
706 .hdr.type = cpu_to_le16(SAP_MSG_NOTIF_NIC_INFO),
707 .hdr.len = cpu_to_le16(sizeof(nic_info_msg) - sizeof(nic_info_msg.hdr)),
708 };
709 struct iwl_sap_msg_dw rfkill_msg = {
710 .hdr.type = cpu_to_le16(SAP_MSG_NOTIF_RADIO_STATE),
711 .hdr.len = cpu_to_le16(sizeof(rfkill_msg) - sizeof(rfkill_msg.hdr)),
712 .val = cpu_to_le32(iwl_mei_cache.rf_kill),
713 };
714
715 iwl_mei_send_sap_msg(mei->cldev, SAP_MSG_NOTIF_WHO_OWNS_NIC);
716
717 if (iwl_mei_cache.conn_info) {
718 link_msg.conn_info = *iwl_mei_cache.conn_info;
719 iwl_mei_send_sap_msg_payload(mei->cldev, &link_msg.hdr);
720 }
721
722 iwl_mei_send_sap_msg_payload(mei->cldev, &mcc_msg.hdr);
723
724 if (iwl_mei_cache.power_limit) {
725 memcpy(sar_msg.sar_chain_info_table, iwl_mei_cache.power_limit,
726 sizeof(sar_msg.sar_chain_info_table));
727 iwl_mei_send_sap_msg_payload(mei->cldev, &sar_msg.hdr);
728 }
729
730 ether_addr_copy(nic_info_msg.mac_address, iwl_mei_cache.mac_address);
731 ether_addr_copy(nic_info_msg.nvm_address, iwl_mei_cache.nvm_address);
732 iwl_mei_send_sap_msg_payload(mei->cldev, &nic_info_msg.hdr);
733
734 iwl_mei_send_sap_msg_payload(mei->cldev, &rfkill_msg.hdr);
735 }
736
iwl_mei_handle_amt_state(struct mei_cl_device * cldev,const struct iwl_sap_msg_dw * dw)737 static void iwl_mei_handle_amt_state(struct mei_cl_device *cldev,
738 const struct iwl_sap_msg_dw *dw)
739 {
740 struct iwl_mei *mei = mei_cldev_get_drvdata(cldev);
741 struct net_device *netdev;
742
743 /*
744 * First take rtnl and only then the mutex to avoid an ABBA
745 * with iwl_mei_set_netdev()
746 */
747 rtnl_lock();
748 mutex_lock(&iwl_mei_mutex);
749
750 netdev = rcu_dereference_protected(iwl_mei_cache.netdev,
751 lockdep_is_held(&iwl_mei_mutex));
752
753 if (mei->amt_enabled == !!le32_to_cpu(dw->val))
754 goto out;
755
756 mei->amt_enabled = dw->val;
757
758 if (mei->amt_enabled) {
759 if (netdev)
760 netdev_rx_handler_register(netdev, iwl_mei_rx_handler, mei);
761
762 iwl_mei_set_init_conf(mei);
763 } else {
764 if (iwl_mei_cache.ops)
765 iwl_mei_cache.ops->rfkill(iwl_mei_cache.priv, false);
766 if (netdev)
767 netdev_rx_handler_unregister(netdev);
768 }
769
770 out:
771 mutex_unlock(&iwl_mei_mutex);
772 rtnl_unlock();
773 }
774
iwl_mei_handle_nic_owner(struct mei_cl_device * cldev,const struct iwl_sap_msg_dw * dw)775 static void iwl_mei_handle_nic_owner(struct mei_cl_device *cldev,
776 const struct iwl_sap_msg_dw *dw)
777 {
778 struct iwl_mei *mei = mei_cldev_get_drvdata(cldev);
779
780 mei->got_ownership = dw->val != cpu_to_le32(SAP_NIC_OWNER_ME);
781 }
782
iwl_mei_handle_can_release_ownership(struct mei_cl_device * cldev,const void * payload)783 static void iwl_mei_handle_can_release_ownership(struct mei_cl_device *cldev,
784 const void *payload)
785 {
786 /* We can get ownership and driver is registered, go ahead */
787 if (iwl_mei_cache.ops)
788 iwl_mei_send_sap_msg(cldev,
789 SAP_MSG_NOTIF_HOST_ASKS_FOR_NIC_OWNERSHIP);
790 }
791
iwl_mei_handle_csme_taking_ownership(struct mei_cl_device * cldev,const void * payload)792 static void iwl_mei_handle_csme_taking_ownership(struct mei_cl_device *cldev,
793 const void *payload)
794 {
795 struct iwl_mei *mei = mei_cldev_get_drvdata(cldev);
796
797 dev_info(&cldev->dev, "CSME takes ownership\n");
798
799 mei->got_ownership = false;
800
801 /*
802 * Remember to send CSME_OWNERSHIP_CONFIRMED when the wifi driver
803 * is finished taking the device down.
804 */
805 mei->csme_taking_ownership = true;
806
807 if (iwl_mei_cache.ops)
808 iwl_mei_cache.ops->rfkill(iwl_mei_cache.priv, true);
809 }
810
iwl_mei_handle_nvm(struct mei_cl_device * cldev,const struct iwl_sap_nvm * sap_nvm)811 static void iwl_mei_handle_nvm(struct mei_cl_device *cldev,
812 const struct iwl_sap_nvm *sap_nvm)
813 {
814 struct iwl_mei *mei = mei_cldev_get_drvdata(cldev);
815 const struct iwl_mei_nvm *mei_nvm = (const void *)sap_nvm;
816 int i;
817
818 kfree(mei->nvm);
819 mei->nvm = kzalloc(sizeof(*mei_nvm), GFP_KERNEL);
820 if (!mei->nvm)
821 return;
822
823 ether_addr_copy(mei->nvm->hw_addr, sap_nvm->hw_addr);
824 mei->nvm->n_hw_addrs = sap_nvm->n_hw_addrs;
825 mei->nvm->radio_cfg = le32_to_cpu(sap_nvm->radio_cfg);
826 mei->nvm->caps = le32_to_cpu(sap_nvm->caps);
827 mei->nvm->nvm_version = le32_to_cpu(sap_nvm->nvm_version);
828
829 for (i = 0; i < ARRAY_SIZE(mei->nvm->channels); i++)
830 mei->nvm->channels[i] = le32_to_cpu(sap_nvm->channels[i]);
831
832 wake_up_all(&mei->get_nvm_wq);
833 }
834
iwl_mei_handle_rx_host_own_req(struct mei_cl_device * cldev,const struct iwl_sap_msg_dw * dw)835 static void iwl_mei_handle_rx_host_own_req(struct mei_cl_device *cldev,
836 const struct iwl_sap_msg_dw *dw)
837 {
838 struct iwl_mei *mei = mei_cldev_get_drvdata(cldev);
839
840 /*
841 * This means that we can't use the wifi device right now, CSME is not
842 * ready to let us use it.
843 */
844 if (!dw->val) {
845 dev_info(&cldev->dev, "Ownership req denied\n");
846 return;
847 }
848
849 mei->got_ownership = true;
850 wake_up_all(&mei->get_ownership_wq);
851
852 iwl_mei_send_sap_msg(cldev,
853 SAP_MSG_NOTIF_HOST_OWNERSHIP_CONFIRMED);
854
855 /* We can now start the connection, unblock rfkill */
856 if (iwl_mei_cache.ops)
857 iwl_mei_cache.ops->rfkill(iwl_mei_cache.priv, false);
858 }
859
iwl_mei_handle_ping(struct mei_cl_device * cldev,const struct iwl_sap_hdr * hdr)860 static void iwl_mei_handle_ping(struct mei_cl_device *cldev,
861 const struct iwl_sap_hdr *hdr)
862 {
863 iwl_mei_send_sap_msg(cldev, SAP_MSG_NOTIF_PONG);
864 }
865
iwl_mei_handle_sap_msg(struct mei_cl_device * cldev,const struct iwl_sap_hdr * hdr)866 static void iwl_mei_handle_sap_msg(struct mei_cl_device *cldev,
867 const struct iwl_sap_hdr *hdr)
868 {
869 u16 len = le16_to_cpu(hdr->len) + sizeof(*hdr);
870 u16 type = le16_to_cpu(hdr->type);
871
872 dev_dbg(&cldev->dev,
873 "Got a new SAP message: type %d, len %d, seq %d\n",
874 le16_to_cpu(hdr->type), len,
875 le32_to_cpu(hdr->seq_num));
876
877 #define SAP_MSG_HANDLER(_cmd, _handler, _sz) \
878 case SAP_MSG_NOTIF_ ## _cmd: \
879 if (len < _sz) { \
880 dev_err(&cldev->dev, \
881 "Bad size for %d: %u < %u\n", \
882 le16_to_cpu(hdr->type), \
883 (unsigned int)len, \
884 (unsigned int)_sz); \
885 break; \
886 } \
887 mutex_lock(&iwl_mei_mutex); \
888 _handler(cldev, (const void *)hdr); \
889 mutex_unlock(&iwl_mei_mutex); \
890 break
891
892 #define SAP_MSG_HANDLER_NO_LOCK(_cmd, _handler, _sz) \
893 case SAP_MSG_NOTIF_ ## _cmd: \
894 if (len < _sz) { \
895 dev_err(&cldev->dev, \
896 "Bad size for %d: %u < %u\n", \
897 le16_to_cpu(hdr->type), \
898 (unsigned int)len, \
899 (unsigned int)_sz); \
900 break; \
901 } \
902 _handler(cldev, (const void *)hdr); \
903 break
904
905 #define SAP_MSG_HANDLER_NO_HANDLER(_cmd, _sz) \
906 case SAP_MSG_NOTIF_ ## _cmd: \
907 if (len < _sz) { \
908 dev_err(&cldev->dev, \
909 "Bad size for %d: %u < %u\n", \
910 le16_to_cpu(hdr->type), \
911 (unsigned int)len, \
912 (unsigned int)_sz); \
913 break; \
914 } \
915 break
916
917 switch (type) {
918 SAP_MSG_HANDLER(PING, iwl_mei_handle_ping, 0);
919 SAP_MSG_HANDLER(CSME_FILTERS,
920 iwl_mei_handle_csme_filters,
921 sizeof(struct iwl_sap_csme_filters));
922 SAP_MSG_HANDLER(CSME_CONN_STATUS,
923 iwl_mei_handle_conn_status,
924 sizeof(struct iwl_sap_notif_conn_status));
925 SAP_MSG_HANDLER_NO_LOCK(AMT_STATE,
926 iwl_mei_handle_amt_state,
927 sizeof(struct iwl_sap_msg_dw));
928 SAP_MSG_HANDLER_NO_HANDLER(PONG, 0);
929 SAP_MSG_HANDLER(NVM, iwl_mei_handle_nvm,
930 sizeof(struct iwl_sap_nvm));
931 SAP_MSG_HANDLER(CSME_REPLY_TO_HOST_OWNERSHIP_REQ,
932 iwl_mei_handle_rx_host_own_req,
933 sizeof(struct iwl_sap_msg_dw));
934 SAP_MSG_HANDLER(NIC_OWNER, iwl_mei_handle_nic_owner,
935 sizeof(struct iwl_sap_msg_dw));
936 SAP_MSG_HANDLER(CSME_CAN_RELEASE_OWNERSHIP,
937 iwl_mei_handle_can_release_ownership, 0);
938 SAP_MSG_HANDLER(CSME_TAKING_OWNERSHIP,
939 iwl_mei_handle_csme_taking_ownership, 0);
940 default:
941 /*
942 * This is not really an error, there are message that we decided
943 * to ignore, yet, it is useful to be able to leave a note if debug
944 * is enabled.
945 */
946 dev_dbg(&cldev->dev, "Unsupported message: type %d, len %d\n",
947 le16_to_cpu(hdr->type), len);
948 }
949
950 #undef SAP_MSG_HANDLER
951 #undef SAP_MSG_HANDLER_NO_LOCK
952 }
953
iwl_mei_read_from_q(const u8 * q_head,u32 q_sz,u32 * _rd,u32 wr,void * _buf,u32 len)954 static void iwl_mei_read_from_q(const u8 *q_head, u32 q_sz,
955 u32 *_rd, u32 wr,
956 void *_buf, u32 len)
957 {
958 u8 *buf = _buf;
959 u32 rd = *_rd;
960
961 if (rd + len <= q_sz) {
962 memcpy(buf, q_head + rd, len);
963 rd += len;
964 } else {
965 memcpy(buf, q_head + rd, q_sz - rd);
966 memcpy(buf + q_sz - rd, q_head, len - (q_sz - rd));
967 rd = len - (q_sz - rd);
968 }
969
970 *_rd = rd;
971 }
972
973 #define QOS_HDR_IV_SNAP_LEN (sizeof(struct ieee80211_qos_hdr) + \
974 IEEE80211_TKIP_IV_LEN + \
975 sizeof(rfc1042_header) + ETH_TLEN)
976
iwl_mei_handle_sap_data(struct mei_cl_device * cldev,const u8 * q_head,u32 q_sz,u32 rd,u32 wr,ssize_t valid_rx_sz,struct sk_buff_head * tx_skbs)977 static void iwl_mei_handle_sap_data(struct mei_cl_device *cldev,
978 const u8 *q_head, u32 q_sz,
979 u32 rd, u32 wr, ssize_t valid_rx_sz,
980 struct sk_buff_head *tx_skbs)
981 {
982 struct iwl_sap_hdr hdr;
983 struct net_device *netdev =
984 rcu_dereference_protected(iwl_mei_cache.netdev,
985 lockdep_is_held(&iwl_mei_mutex));
986
987 if (!netdev)
988 return;
989
990 while (valid_rx_sz >= sizeof(hdr)) {
991 struct ethhdr *ethhdr;
992 unsigned char *data;
993 struct sk_buff *skb;
994 u16 len;
995
996 iwl_mei_read_from_q(q_head, q_sz, &rd, wr, &hdr, sizeof(hdr));
997 valid_rx_sz -= sizeof(hdr);
998 len = le16_to_cpu(hdr.len);
999
1000 if (valid_rx_sz < len) {
1001 dev_err(&cldev->dev,
1002 "Data queue is corrupted: valid data len %zd, len %d\n",
1003 valid_rx_sz, len);
1004 break;
1005 }
1006
1007 if (len < sizeof(*ethhdr)) {
1008 dev_err(&cldev->dev,
1009 "Data len is smaller than an ethernet header? len = %d\n",
1010 len);
1011 }
1012
1013 valid_rx_sz -= len;
1014
1015 if (le16_to_cpu(hdr.type) != SAP_MSG_DATA_PACKET) {
1016 dev_err(&cldev->dev, "Unsupported Rx data: type %d, len %d\n",
1017 le16_to_cpu(hdr.type), len);
1018 continue;
1019 }
1020
1021 /* We need enough room for the WiFi header + SNAP + IV */
1022 skb = netdev_alloc_skb(netdev, len + QOS_HDR_IV_SNAP_LEN);
1023 if (!skb)
1024 continue;
1025
1026 skb_reserve(skb, QOS_HDR_IV_SNAP_LEN);
1027 ethhdr = skb_push(skb, sizeof(*ethhdr));
1028
1029 iwl_mei_read_from_q(q_head, q_sz, &rd, wr,
1030 ethhdr, sizeof(*ethhdr));
1031 len -= sizeof(*ethhdr);
1032
1033 skb_reset_mac_header(skb);
1034 skb_reset_network_header(skb);
1035 skb->protocol = ethhdr->h_proto;
1036
1037 data = skb_put(skb, len);
1038 iwl_mei_read_from_q(q_head, q_sz, &rd, wr, data, len);
1039
1040 /*
1041 * Enqueue the skb here so that it can be sent later when we
1042 * do not hold the mutex. TX'ing a packet with a mutex held is
1043 * possible, but it wouldn't be nice to forbid the TX path to
1044 * call any of iwlmei's functions, since every API from iwlmei
1045 * needs the mutex.
1046 */
1047 __skb_queue_tail(tx_skbs, skb);
1048 }
1049 }
1050
iwl_mei_handle_sap_rx_cmd(struct mei_cl_device * cldev,const u8 * q_head,u32 q_sz,u32 rd,u32 wr,ssize_t valid_rx_sz)1051 static void iwl_mei_handle_sap_rx_cmd(struct mei_cl_device *cldev,
1052 const u8 *q_head, u32 q_sz,
1053 u32 rd, u32 wr, ssize_t valid_rx_sz)
1054 {
1055 struct page *p = alloc_page(GFP_KERNEL);
1056 struct iwl_sap_hdr *hdr;
1057
1058 if (!p)
1059 return;
1060
1061 hdr = page_address(p);
1062
1063 while (valid_rx_sz >= sizeof(*hdr)) {
1064 u16 len;
1065
1066 iwl_mei_read_from_q(q_head, q_sz, &rd, wr, hdr, sizeof(*hdr));
1067 valid_rx_sz -= sizeof(*hdr);
1068 len = le16_to_cpu(hdr->len);
1069
1070 if (valid_rx_sz < len)
1071 break;
1072
1073 iwl_mei_read_from_q(q_head, q_sz, &rd, wr, hdr + 1, len);
1074
1075 trace_iwlmei_sap_cmd(hdr, false);
1076 iwl_mei_handle_sap_msg(cldev, hdr);
1077 valid_rx_sz -= len;
1078 }
1079
1080 /* valid_rx_sz must be 0 now... */
1081 if (valid_rx_sz)
1082 dev_err(&cldev->dev,
1083 "More data in the buffer although we read it all\n");
1084
1085 __free_page(p);
1086 }
1087
iwl_mei_handle_sap_rx(struct mei_cl_device * cldev,struct iwl_sap_q_ctrl_blk * notif_q,const u8 * q_head,struct sk_buff_head * skbs,u32 q_sz)1088 static void iwl_mei_handle_sap_rx(struct mei_cl_device *cldev,
1089 struct iwl_sap_q_ctrl_blk *notif_q,
1090 const u8 *q_head,
1091 struct sk_buff_head *skbs,
1092 u32 q_sz)
1093 {
1094 u32 rd = le32_to_cpu(READ_ONCE(notif_q->rd_ptr));
1095 u32 wr = le32_to_cpu(READ_ONCE(notif_q->wr_ptr));
1096 ssize_t valid_rx_sz;
1097
1098 if (rd > q_sz || wr > q_sz) {
1099 dev_err(&cldev->dev,
1100 "Pointers are past the buffer limit\n");
1101 return;
1102 }
1103
1104 if (rd == wr)
1105 return;
1106
1107 valid_rx_sz = wr > rd ? wr - rd : q_sz - rd + wr;
1108
1109 if (skbs)
1110 iwl_mei_handle_sap_data(cldev, q_head, q_sz, rd, wr,
1111 valid_rx_sz, skbs);
1112 else
1113 iwl_mei_handle_sap_rx_cmd(cldev, q_head, q_sz, rd, wr,
1114 valid_rx_sz);
1115
1116 /* Increment the read pointer to point to the write pointer */
1117 WRITE_ONCE(notif_q->rd_ptr, cpu_to_le32(wr));
1118 }
1119
iwl_mei_handle_check_shared_area(struct mei_cl_device * cldev)1120 static void iwl_mei_handle_check_shared_area(struct mei_cl_device *cldev)
1121 {
1122 struct iwl_mei *mei = mei_cldev_get_drvdata(cldev);
1123 struct iwl_sap_q_ctrl_blk *notif_q;
1124 struct sk_buff_head tx_skbs;
1125 struct iwl_sap_dir *dir;
1126 void *q_head;
1127 u32 q_sz;
1128
1129 if (!mei->shared_mem.ctrl)
1130 return;
1131
1132 dir = &mei->shared_mem.ctrl->dir[SAP_DIRECTION_ME_TO_HOST];
1133 notif_q = &dir->q_ctrl_blk[SAP_QUEUE_IDX_NOTIF];
1134 q_head = mei->shared_mem.q_head[SAP_DIRECTION_ME_TO_HOST][SAP_QUEUE_IDX_NOTIF];
1135 q_sz = mei->shared_mem.q_size[SAP_DIRECTION_ME_TO_HOST][SAP_QUEUE_IDX_NOTIF];
1136
1137 /*
1138 * Do not hold the mutex here, but rather each and every message
1139 * handler takes it.
1140 * This allows message handlers to take it at a certain time.
1141 */
1142 iwl_mei_handle_sap_rx(cldev, notif_q, q_head, NULL, q_sz);
1143
1144 mutex_lock(&iwl_mei_mutex);
1145 dir = &mei->shared_mem.ctrl->dir[SAP_DIRECTION_ME_TO_HOST];
1146 notif_q = &dir->q_ctrl_blk[SAP_QUEUE_IDX_DATA];
1147 q_head = mei->shared_mem.q_head[SAP_DIRECTION_ME_TO_HOST][SAP_QUEUE_IDX_DATA];
1148 q_sz = mei->shared_mem.q_size[SAP_DIRECTION_ME_TO_HOST][SAP_QUEUE_IDX_DATA];
1149
1150 __skb_queue_head_init(&tx_skbs);
1151
1152 iwl_mei_handle_sap_rx(cldev, notif_q, q_head, &tx_skbs, q_sz);
1153
1154 if (skb_queue_empty(&tx_skbs)) {
1155 mutex_unlock(&iwl_mei_mutex);
1156 return;
1157 }
1158
1159 /*
1160 * Take the RCU read lock before we unlock the mutex to make sure that
1161 * even if the netdev is replaced by another non-NULL netdev right after
1162 * we unlock the mutex, the old netdev will still be valid when we
1163 * transmit the frames. We can't allow to replace the netdev here because
1164 * the skbs hold a pointer to the netdev.
1165 */
1166 rcu_read_lock();
1167
1168 mutex_unlock(&iwl_mei_mutex);
1169
1170 if (!rcu_access_pointer(iwl_mei_cache.netdev)) {
1171 dev_err(&cldev->dev, "Can't Tx without a netdev\n");
1172 skb_queue_purge(&tx_skbs);
1173 goto out;
1174 }
1175
1176 while (!skb_queue_empty(&tx_skbs)) {
1177 struct sk_buff *skb = __skb_dequeue(&tx_skbs);
1178
1179 trace_iwlmei_sap_data(skb, IWL_SAP_RX_DATA_TO_AIR);
1180 dev_queue_xmit(skb);
1181 }
1182
1183 out:
1184 rcu_read_unlock();
1185 }
1186
iwl_mei_rx(struct mei_cl_device * cldev)1187 static void iwl_mei_rx(struct mei_cl_device *cldev)
1188 {
1189 struct iwl_sap_me_msg_hdr *hdr;
1190 u8 msg[100];
1191 ssize_t ret;
1192
1193 ret = mei_cldev_recv(cldev, (u8 *)&msg, sizeof(msg));
1194 if (ret < 0) {
1195 dev_err(&cldev->dev, "failed to receive data: %zd\n", ret);
1196 return;
1197 }
1198
1199 if (ret == 0) {
1200 dev_err(&cldev->dev, "got an empty response\n");
1201 return;
1202 }
1203
1204 hdr = (void *)msg;
1205 trace_iwlmei_me_msg(hdr, false);
1206
1207 switch (le32_to_cpu(hdr->type)) {
1208 case SAP_ME_MSG_START_OK:
1209 BUILD_BUG_ON(sizeof(struct iwl_sap_me_msg_start_ok) >
1210 sizeof(msg));
1211
1212 iwl_mei_handle_rx_start_ok(cldev, (void *)msg, ret);
1213 break;
1214 case SAP_ME_MSG_CHECK_SHARED_AREA:
1215 iwl_mei_handle_check_shared_area(cldev);
1216 break;
1217 default:
1218 dev_err(&cldev->dev, "got a RX notification: %d\n",
1219 le32_to_cpu(hdr->type));
1220 break;
1221 }
1222 }
1223
iwl_mei_send_start(struct mei_cl_device * cldev)1224 static int iwl_mei_send_start(struct mei_cl_device *cldev)
1225 {
1226 struct iwl_mei *mei = mei_cldev_get_drvdata(cldev);
1227 struct iwl_sap_me_msg_start msg = {
1228 .hdr.type = cpu_to_le32(SAP_ME_MSG_START),
1229 .hdr.seq_num = cpu_to_le32(atomic_inc_return(&mei->seq_no)),
1230 .hdr.len = cpu_to_le32(sizeof(msg)),
1231 .supported_versions[0] = SAP_VERSION,
1232 .init_data_seq_num = cpu_to_le16(0x100),
1233 .init_notif_seq_num = cpu_to_le16(0x800),
1234 };
1235 int ret;
1236
1237 trace_iwlmei_me_msg(&msg.hdr, true);
1238 ret = mei_cldev_send(cldev, (void *)&msg, sizeof(msg));
1239 if (ret != sizeof(msg)) {
1240 dev_err(&cldev->dev,
1241 "failed to send the SAP_ME_MSG_START message %d\n",
1242 ret);
1243 return ret;
1244 }
1245
1246 return 0;
1247 }
1248
iwl_mei_enable(struct mei_cl_device * cldev)1249 static int iwl_mei_enable(struct mei_cl_device *cldev)
1250 {
1251 int ret;
1252
1253 ret = mei_cldev_enable(cldev);
1254 if (ret < 0) {
1255 dev_err(&cldev->dev, "failed to enable the device: %d\n", ret);
1256 return ret;
1257 }
1258
1259 ret = mei_cldev_register_rx_cb(cldev, iwl_mei_rx);
1260 if (ret) {
1261 dev_err(&cldev->dev,
1262 "failed to register to the rx cb: %d\n", ret);
1263 mei_cldev_disable(cldev);
1264 return ret;
1265 }
1266
1267 return 0;
1268 }
1269
iwl_mei_get_nvm(void)1270 struct iwl_mei_nvm *iwl_mei_get_nvm(void)
1271 {
1272 struct iwl_mei_nvm *nvm = NULL;
1273 struct iwl_mei *mei;
1274 int ret;
1275
1276 mutex_lock(&iwl_mei_mutex);
1277
1278 if (!iwl_mei_is_connected())
1279 goto out;
1280
1281 mei = mei_cldev_get_drvdata(iwl_mei_global_cldev);
1282
1283 if (!mei)
1284 goto out;
1285
1286 ret = iwl_mei_send_sap_msg(iwl_mei_global_cldev,
1287 SAP_MSG_NOTIF_GET_NVM);
1288 if (ret)
1289 goto out;
1290
1291 mutex_unlock(&iwl_mei_mutex);
1292
1293 ret = wait_event_timeout(mei->get_nvm_wq, mei->nvm, 2 * HZ);
1294 if (!ret)
1295 return NULL;
1296
1297 mutex_lock(&iwl_mei_mutex);
1298
1299 if (!iwl_mei_is_connected())
1300 goto out;
1301
1302 mei = mei_cldev_get_drvdata(iwl_mei_global_cldev);
1303
1304 if (!mei)
1305 goto out;
1306
1307 if (mei->nvm)
1308 nvm = kmemdup(mei->nvm, sizeof(*mei->nvm), GFP_KERNEL);
1309
1310 out:
1311 mutex_unlock(&iwl_mei_mutex);
1312 return nvm;
1313 }
1314 EXPORT_SYMBOL_GPL(iwl_mei_get_nvm);
1315
iwl_mei_get_ownership(void)1316 int iwl_mei_get_ownership(void)
1317 {
1318 struct iwl_mei *mei;
1319 int ret;
1320
1321 mutex_lock(&iwl_mei_mutex);
1322
1323 /* In case we didn't have a bind */
1324 if (!iwl_mei_is_connected()) {
1325 ret = 0;
1326 goto out;
1327 }
1328
1329 mei = mei_cldev_get_drvdata(iwl_mei_global_cldev);
1330
1331 if (!mei) {
1332 ret = -ENODEV;
1333 goto out;
1334 }
1335
1336 if (!mei->amt_enabled) {
1337 ret = 0;
1338 goto out;
1339 }
1340
1341 if (mei->got_ownership) {
1342 ret = 0;
1343 goto out;
1344 }
1345
1346 ret = iwl_mei_send_sap_msg(mei->cldev,
1347 SAP_MSG_NOTIF_HOST_ASKS_FOR_NIC_OWNERSHIP);
1348 if (ret)
1349 goto out;
1350
1351 mutex_unlock(&iwl_mei_mutex);
1352
1353 ret = wait_event_timeout(mei->get_ownership_wq,
1354 mei->got_ownership, HZ / 2);
1355 if (!ret)
1356 return -ETIMEDOUT;
1357
1358 mutex_lock(&iwl_mei_mutex);
1359
1360 /* In case we didn't have a bind */
1361 if (!iwl_mei_is_connected()) {
1362 ret = 0;
1363 goto out;
1364 }
1365
1366 mei = mei_cldev_get_drvdata(iwl_mei_global_cldev);
1367
1368 if (!mei) {
1369 ret = -ENODEV;
1370 goto out;
1371 }
1372
1373 ret = !mei->got_ownership;
1374
1375 out:
1376 mutex_unlock(&iwl_mei_mutex);
1377 return ret;
1378 }
1379 EXPORT_SYMBOL_GPL(iwl_mei_get_ownership);
1380
iwl_mei_host_associated(const struct iwl_mei_conn_info * conn_info,const struct iwl_mei_colloc_info * colloc_info)1381 void iwl_mei_host_associated(const struct iwl_mei_conn_info *conn_info,
1382 const struct iwl_mei_colloc_info *colloc_info)
1383 {
1384 struct iwl_sap_notif_host_link_up msg = {
1385 .hdr.type = cpu_to_le16(SAP_MSG_NOTIF_HOST_LINK_UP),
1386 .hdr.len = cpu_to_le16(sizeof(msg) - sizeof(msg.hdr)),
1387 .conn_info = {
1388 .ssid_len = cpu_to_le32(conn_info->ssid_len),
1389 .channel = conn_info->channel,
1390 .band = conn_info->band,
1391 .pairwise_cipher = cpu_to_le32(conn_info->pairwise_cipher),
1392 .auth_mode = cpu_to_le32(conn_info->auth_mode),
1393 },
1394 };
1395 struct iwl_mei *mei;
1396
1397 if (conn_info->ssid_len > ARRAY_SIZE(msg.conn_info.ssid))
1398 return;
1399
1400 memcpy(msg.conn_info.ssid, conn_info->ssid, conn_info->ssid_len);
1401 memcpy(msg.conn_info.bssid, conn_info->bssid, ETH_ALEN);
1402
1403 if (colloc_info) {
1404 msg.colloc_channel = colloc_info->channel;
1405 msg.colloc_band = colloc_info->channel <= 14 ? 0 : 1;
1406 memcpy(msg.colloc_bssid, colloc_info->bssid, ETH_ALEN);
1407 }
1408
1409 mutex_lock(&iwl_mei_mutex);
1410
1411 if (!iwl_mei_is_connected())
1412 goto out;
1413
1414 mei = mei_cldev_get_drvdata(iwl_mei_global_cldev);
1415
1416 if (!mei)
1417 goto out;
1418
1419 if (!mei->amt_enabled)
1420 goto out;
1421
1422 iwl_mei_send_sap_msg_payload(mei->cldev, &msg.hdr);
1423
1424 out:
1425 kfree(iwl_mei_cache.conn_info);
1426 iwl_mei_cache.conn_info =
1427 kmemdup(&msg.conn_info, sizeof(msg.conn_info), GFP_KERNEL);
1428 mutex_unlock(&iwl_mei_mutex);
1429 }
1430 EXPORT_SYMBOL_GPL(iwl_mei_host_associated);
1431
iwl_mei_host_disassociated(void)1432 void iwl_mei_host_disassociated(void)
1433 {
1434 struct iwl_mei *mei;
1435 struct iwl_sap_notif_host_link_down msg = {
1436 .hdr.type = cpu_to_le16(SAP_MSG_NOTIF_HOST_LINK_DOWN),
1437 .hdr.len = cpu_to_le16(sizeof(msg) - sizeof(msg.hdr)),
1438 .type = HOST_LINK_DOWN_TYPE_LONG,
1439 };
1440
1441 mutex_lock(&iwl_mei_mutex);
1442
1443 if (!iwl_mei_is_connected())
1444 goto out;
1445
1446 mei = mei_cldev_get_drvdata(iwl_mei_global_cldev);
1447
1448 if (!mei)
1449 goto out;
1450
1451 iwl_mei_send_sap_msg_payload(mei->cldev, &msg.hdr);
1452
1453 out:
1454 kfree(iwl_mei_cache.conn_info);
1455 iwl_mei_cache.conn_info = NULL;
1456 mutex_unlock(&iwl_mei_mutex);
1457 }
1458 EXPORT_SYMBOL_GPL(iwl_mei_host_disassociated);
1459
iwl_mei_set_rfkill_state(bool hw_rfkill,bool sw_rfkill)1460 void iwl_mei_set_rfkill_state(bool hw_rfkill, bool sw_rfkill)
1461 {
1462 struct iwl_mei *mei;
1463 u32 rfkill_state = 0;
1464 struct iwl_sap_msg_dw msg = {
1465 .hdr.type = cpu_to_le16(SAP_MSG_NOTIF_RADIO_STATE),
1466 .hdr.len = cpu_to_le16(sizeof(msg) - sizeof(msg.hdr)),
1467 };
1468
1469 if (!sw_rfkill)
1470 rfkill_state |= SAP_SW_RFKILL_DEASSERTED;
1471
1472 if (!hw_rfkill)
1473 rfkill_state |= SAP_HW_RFKILL_DEASSERTED;
1474
1475 mutex_lock(&iwl_mei_mutex);
1476
1477 if (!iwl_mei_is_connected())
1478 goto out;
1479
1480 msg.val = cpu_to_le32(rfkill_state);
1481
1482 mei = mei_cldev_get_drvdata(iwl_mei_global_cldev);
1483
1484 if (!mei)
1485 goto out;
1486
1487 iwl_mei_send_sap_msg_payload(mei->cldev, &msg.hdr);
1488
1489 out:
1490 iwl_mei_cache.rf_kill = rfkill_state;
1491 mutex_unlock(&iwl_mei_mutex);
1492 }
1493 EXPORT_SYMBOL_GPL(iwl_mei_set_rfkill_state);
1494
iwl_mei_set_nic_info(const u8 * mac_address,const u8 * nvm_address)1495 void iwl_mei_set_nic_info(const u8 *mac_address, const u8 *nvm_address)
1496 {
1497 struct iwl_mei *mei;
1498 struct iwl_sap_notif_host_nic_info msg = {
1499 .hdr.type = cpu_to_le16(SAP_MSG_NOTIF_NIC_INFO),
1500 .hdr.len = cpu_to_le16(sizeof(msg) - sizeof(msg.hdr)),
1501 };
1502
1503 mutex_lock(&iwl_mei_mutex);
1504
1505 if (!iwl_mei_is_connected())
1506 goto out;
1507
1508 ether_addr_copy(msg.mac_address, mac_address);
1509 ether_addr_copy(msg.nvm_address, nvm_address);
1510
1511 mei = mei_cldev_get_drvdata(iwl_mei_global_cldev);
1512
1513 if (!mei)
1514 goto out;
1515
1516 iwl_mei_send_sap_msg_payload(mei->cldev, &msg.hdr);
1517
1518 out:
1519 ether_addr_copy(iwl_mei_cache.mac_address, mac_address);
1520 ether_addr_copy(iwl_mei_cache.nvm_address, nvm_address);
1521 mutex_unlock(&iwl_mei_mutex);
1522 }
1523 EXPORT_SYMBOL_GPL(iwl_mei_set_nic_info);
1524
iwl_mei_set_country_code(u16 mcc)1525 void iwl_mei_set_country_code(u16 mcc)
1526 {
1527 struct iwl_mei *mei;
1528 struct iwl_sap_notif_country_code msg = {
1529 .hdr.type = cpu_to_le16(SAP_MSG_NOTIF_COUNTRY_CODE),
1530 .hdr.len = cpu_to_le16(sizeof(msg) - sizeof(msg.hdr)),
1531 .mcc = cpu_to_le16(mcc),
1532 };
1533
1534 mutex_lock(&iwl_mei_mutex);
1535
1536 if (!iwl_mei_is_connected())
1537 goto out;
1538
1539 mei = mei_cldev_get_drvdata(iwl_mei_global_cldev);
1540
1541 if (!mei)
1542 goto out;
1543
1544 iwl_mei_send_sap_msg_payload(mei->cldev, &msg.hdr);
1545
1546 out:
1547 iwl_mei_cache.mcc = mcc;
1548 mutex_unlock(&iwl_mei_mutex);
1549 }
1550 EXPORT_SYMBOL_GPL(iwl_mei_set_country_code);
1551
iwl_mei_set_power_limit(const __le16 * power_limit)1552 void iwl_mei_set_power_limit(const __le16 *power_limit)
1553 {
1554 struct iwl_mei *mei;
1555 struct iwl_sap_notif_sar_limits msg = {
1556 .hdr.type = cpu_to_le16(SAP_MSG_NOTIF_SAR_LIMITS),
1557 .hdr.len = cpu_to_le16(sizeof(msg) - sizeof(msg.hdr)),
1558 };
1559
1560 mutex_lock(&iwl_mei_mutex);
1561
1562 if (!iwl_mei_is_connected())
1563 goto out;
1564
1565 mei = mei_cldev_get_drvdata(iwl_mei_global_cldev);
1566
1567 if (!mei)
1568 goto out;
1569
1570 memcpy(msg.sar_chain_info_table, power_limit, sizeof(msg.sar_chain_info_table));
1571
1572 iwl_mei_send_sap_msg_payload(mei->cldev, &msg.hdr);
1573
1574 out:
1575 kfree(iwl_mei_cache.power_limit);
1576 iwl_mei_cache.power_limit = kmemdup(power_limit,
1577 sizeof(msg.sar_chain_info_table), GFP_KERNEL);
1578 mutex_unlock(&iwl_mei_mutex);
1579 }
1580 EXPORT_SYMBOL_GPL(iwl_mei_set_power_limit);
1581
iwl_mei_set_netdev(struct net_device * netdev)1582 void iwl_mei_set_netdev(struct net_device *netdev)
1583 {
1584 struct iwl_mei *mei;
1585
1586 mutex_lock(&iwl_mei_mutex);
1587
1588 if (!iwl_mei_is_connected()) {
1589 rcu_assign_pointer(iwl_mei_cache.netdev, netdev);
1590 goto out;
1591 }
1592
1593 mei = mei_cldev_get_drvdata(iwl_mei_global_cldev);
1594
1595 if (!mei)
1596 goto out;
1597
1598 if (!netdev) {
1599 struct net_device *dev =
1600 rcu_dereference_protected(iwl_mei_cache.netdev,
1601 lockdep_is_held(&iwl_mei_mutex));
1602
1603 if (!dev)
1604 goto out;
1605
1606 netdev_rx_handler_unregister(dev);
1607 }
1608
1609 rcu_assign_pointer(iwl_mei_cache.netdev, netdev);
1610
1611 if (netdev && mei->amt_enabled)
1612 netdev_rx_handler_register(netdev, iwl_mei_rx_handler, mei);
1613
1614 out:
1615 mutex_unlock(&iwl_mei_mutex);
1616 }
1617 EXPORT_SYMBOL_GPL(iwl_mei_set_netdev);
1618
iwl_mei_device_down(void)1619 void iwl_mei_device_down(void)
1620 {
1621 struct iwl_mei *mei;
1622
1623 mutex_lock(&iwl_mei_mutex);
1624
1625 if (!iwl_mei_is_connected())
1626 goto out;
1627
1628 mei = mei_cldev_get_drvdata(iwl_mei_global_cldev);
1629
1630 if (!mei)
1631 goto out;
1632
1633 if (!mei->csme_taking_ownership)
1634 goto out;
1635
1636 iwl_mei_send_sap_msg(mei->cldev,
1637 SAP_MSG_NOTIF_CSME_OWNERSHIP_CONFIRMED);
1638 mei->csme_taking_ownership = false;
1639 out:
1640 mutex_unlock(&iwl_mei_mutex);
1641 }
1642 EXPORT_SYMBOL_GPL(iwl_mei_device_down);
1643
iwl_mei_register(void * priv,const struct iwl_mei_ops * ops)1644 int iwl_mei_register(void *priv, const struct iwl_mei_ops *ops)
1645 {
1646 int ret;
1647
1648 /*
1649 * We must have a non-NULL priv pointer to not crash when there are
1650 * multiple WiFi devices.
1651 */
1652 if (!priv)
1653 return -EINVAL;
1654
1655 mutex_lock(&iwl_mei_mutex);
1656
1657 /* do not allow registration if someone else already registered */
1658 if (iwl_mei_cache.priv || iwl_mei_cache.ops) {
1659 ret = -EBUSY;
1660 goto out;
1661 }
1662
1663 iwl_mei_cache.priv = priv;
1664 iwl_mei_cache.ops = ops;
1665
1666 if (iwl_mei_global_cldev) {
1667 struct iwl_mei *mei =
1668 mei_cldev_get_drvdata(iwl_mei_global_cldev);
1669
1670 /* we have already a SAP connection */
1671 if (iwl_mei_is_connected()) {
1672 iwl_mei_send_sap_msg(mei->cldev,
1673 SAP_MSG_NOTIF_WIFIDR_UP);
1674 ops->rfkill(priv, mei->link_prot_state);
1675 }
1676 }
1677 ret = 0;
1678
1679 out:
1680 mutex_unlock(&iwl_mei_mutex);
1681 return ret;
1682 }
1683 EXPORT_SYMBOL_GPL(iwl_mei_register);
1684
iwl_mei_start_unregister(void)1685 void iwl_mei_start_unregister(void)
1686 {
1687 mutex_lock(&iwl_mei_mutex);
1688
1689 /* At this point, the wifi driver should have removed the netdev */
1690 if (rcu_access_pointer(iwl_mei_cache.netdev))
1691 pr_err("Still had a netdev pointer set upon unregister\n");
1692
1693 kfree(iwl_mei_cache.conn_info);
1694 iwl_mei_cache.conn_info = NULL;
1695 kfree(iwl_mei_cache.power_limit);
1696 iwl_mei_cache.power_limit = NULL;
1697 iwl_mei_cache.ops = NULL;
1698 /* leave iwl_mei_cache.priv non-NULL to prevent any new registration */
1699
1700 mutex_unlock(&iwl_mei_mutex);
1701 }
1702 EXPORT_SYMBOL_GPL(iwl_mei_start_unregister);
1703
iwl_mei_unregister_complete(void)1704 void iwl_mei_unregister_complete(void)
1705 {
1706 mutex_lock(&iwl_mei_mutex);
1707
1708 iwl_mei_cache.priv = NULL;
1709
1710 if (iwl_mei_global_cldev) {
1711 struct iwl_mei *mei =
1712 mei_cldev_get_drvdata(iwl_mei_global_cldev);
1713
1714 iwl_mei_send_sap_msg(mei->cldev, SAP_MSG_NOTIF_WIFIDR_DOWN);
1715 mei->got_ownership = false;
1716 }
1717
1718 mutex_unlock(&iwl_mei_mutex);
1719 }
1720 EXPORT_SYMBOL_GPL(iwl_mei_unregister_complete);
1721
1722 #if IS_ENABLED(CONFIG_DEBUG_FS)
1723
1724 static ssize_t
iwl_mei_dbgfs_send_start_message_write(struct file * file,const char __user * user_buf,size_t count,loff_t * ppos)1725 iwl_mei_dbgfs_send_start_message_write(struct file *file,
1726 const char __user *user_buf,
1727 size_t count, loff_t *ppos)
1728 {
1729 int ret;
1730
1731 mutex_lock(&iwl_mei_mutex);
1732
1733 if (!iwl_mei_global_cldev) {
1734 ret = -ENODEV;
1735 goto out;
1736 }
1737
1738 ret = iwl_mei_send_start(iwl_mei_global_cldev);
1739
1740 out:
1741 mutex_unlock(&iwl_mei_mutex);
1742 return ret ?: count;
1743 }
1744
1745 static const struct file_operations iwl_mei_dbgfs_send_start_message_ops = {
1746 .write = iwl_mei_dbgfs_send_start_message_write,
1747 .open = simple_open,
1748 .llseek = default_llseek,
1749 };
1750
iwl_mei_dbgfs_req_ownership_write(struct file * file,const char __user * user_buf,size_t count,loff_t * ppos)1751 static ssize_t iwl_mei_dbgfs_req_ownership_write(struct file *file,
1752 const char __user *user_buf,
1753 size_t count, loff_t *ppos)
1754 {
1755 iwl_mei_get_ownership();
1756
1757 return count;
1758 }
1759
1760 static const struct file_operations iwl_mei_dbgfs_req_ownership_ops = {
1761 .write = iwl_mei_dbgfs_req_ownership_write,
1762 .open = simple_open,
1763 .llseek = default_llseek,
1764 };
1765
iwl_mei_dbgfs_register(struct iwl_mei * mei)1766 static void iwl_mei_dbgfs_register(struct iwl_mei *mei)
1767 {
1768 mei->dbgfs_dir = debugfs_create_dir(KBUILD_MODNAME, NULL);
1769
1770 if (!mei->dbgfs_dir)
1771 return;
1772
1773 debugfs_create_ulong("status", S_IRUSR,
1774 mei->dbgfs_dir, &iwl_mei_status);
1775 debugfs_create_file("send_start_message", S_IWUSR, mei->dbgfs_dir,
1776 mei, &iwl_mei_dbgfs_send_start_message_ops);
1777 debugfs_create_file("req_ownership", S_IWUSR, mei->dbgfs_dir,
1778 mei, &iwl_mei_dbgfs_req_ownership_ops);
1779 }
1780
iwl_mei_dbgfs_unregister(struct iwl_mei * mei)1781 static void iwl_mei_dbgfs_unregister(struct iwl_mei *mei)
1782 {
1783 debugfs_remove_recursive(mei->dbgfs_dir);
1784 mei->dbgfs_dir = NULL;
1785 }
1786
1787 #else
1788
iwl_mei_dbgfs_register(struct iwl_mei * mei)1789 static void iwl_mei_dbgfs_register(struct iwl_mei *mei) {}
iwl_mei_dbgfs_unregister(struct iwl_mei * mei)1790 static void iwl_mei_dbgfs_unregister(struct iwl_mei *mei) {}
1791
1792 #endif /* CONFIG_DEBUG_FS */
1793
1794 #define ALLOC_SHARED_MEM_RETRY_MAX_NUM 3
1795
1796 /*
1797 * iwl_mei_probe - the probe function called by the mei bus enumeration
1798 *
1799 * This allocates the data needed by iwlmei and sets a pointer to this data
1800 * into the mei_cl_device's drvdata.
1801 * It starts the SAP protocol by sending the SAP_ME_MSG_START without
1802 * waiting for the answer. The answer will be caught later by the Rx callback.
1803 */
iwl_mei_probe(struct mei_cl_device * cldev,const struct mei_cl_device_id * id)1804 static int iwl_mei_probe(struct mei_cl_device *cldev,
1805 const struct mei_cl_device_id *id)
1806 {
1807 int alloc_retry = ALLOC_SHARED_MEM_RETRY_MAX_NUM;
1808 struct iwl_mei *mei;
1809 int ret;
1810
1811 mei = devm_kzalloc(&cldev->dev, sizeof(*mei), GFP_KERNEL);
1812 if (!mei)
1813 return -ENOMEM;
1814
1815 init_waitqueue_head(&mei->get_nvm_wq);
1816 INIT_WORK(&mei->send_csa_msg_wk, iwl_mei_send_csa_msg_wk);
1817 INIT_DELAYED_WORK(&mei->csa_throttle_end_wk,
1818 iwl_mei_csa_throttle_end_wk);
1819 init_waitqueue_head(&mei->get_ownership_wq);
1820 spin_lock_init(&mei->data_q_lock);
1821
1822 mei_cldev_set_drvdata(cldev, mei);
1823 mei->cldev = cldev;
1824
1825 do {
1826 ret = iwl_mei_alloc_shared_mem(cldev);
1827 if (!ret)
1828 break;
1829 /*
1830 * The CSME firmware needs to boot the internal WLAN client.
1831 * This can take time in certain configurations (usually
1832 * upon resume and when the whole CSME firmware is shut down
1833 * during suspend).
1834 *
1835 * Wait a bit before retrying and hope we'll succeed next time.
1836 */
1837
1838 dev_dbg(&cldev->dev,
1839 "Couldn't allocate the shared memory: %d, attempt %d / %d\n",
1840 ret, alloc_retry, ALLOC_SHARED_MEM_RETRY_MAX_NUM);
1841 msleep(100);
1842 alloc_retry--;
1843 } while (alloc_retry);
1844
1845 if (ret) {
1846 dev_err(&cldev->dev, "Couldn't allocate the shared memory: %d\n",
1847 ret);
1848 goto free;
1849 }
1850
1851 iwl_mei_init_shared_mem(mei);
1852
1853 ret = iwl_mei_enable(cldev);
1854 if (ret)
1855 goto free_shared_mem;
1856
1857 iwl_mei_dbgfs_register(mei);
1858
1859 /*
1860 * We now have a Rx function in place, start the SAP procotol
1861 * we expect to get the SAP_ME_MSG_START_OK response later on.
1862 */
1863 mutex_lock(&iwl_mei_mutex);
1864 ret = iwl_mei_send_start(cldev);
1865 mutex_unlock(&iwl_mei_mutex);
1866 if (ret)
1867 goto debugfs_unregister;
1868
1869 /* must be last */
1870 iwl_mei_global_cldev = cldev;
1871
1872 return 0;
1873
1874 debugfs_unregister:
1875 iwl_mei_dbgfs_unregister(mei);
1876 mei_cldev_disable(cldev);
1877 free_shared_mem:
1878 iwl_mei_free_shared_mem(cldev);
1879 free:
1880 mei_cldev_set_drvdata(cldev, NULL);
1881 devm_kfree(&cldev->dev, mei);
1882
1883 return ret;
1884 }
1885
1886 #define SEND_SAP_MAX_WAIT_ITERATION 10
1887
iwl_mei_remove(struct mei_cl_device * cldev)1888 static void iwl_mei_remove(struct mei_cl_device *cldev)
1889 {
1890 struct iwl_mei *mei = mei_cldev_get_drvdata(cldev);
1891 int i;
1892
1893 /*
1894 * We are being removed while the bus is active, it means we are
1895 * going to suspend/ shutdown, so the NIC will disappear.
1896 */
1897 if (mei_cldev_enabled(cldev) && iwl_mei_cache.ops)
1898 iwl_mei_cache.ops->nic_stolen(iwl_mei_cache.priv);
1899
1900 if (rcu_access_pointer(iwl_mei_cache.netdev)) {
1901 struct net_device *dev;
1902
1903 /*
1904 * First take rtnl and only then the mutex to avoid an ABBA
1905 * with iwl_mei_set_netdev()
1906 */
1907 rtnl_lock();
1908 mutex_lock(&iwl_mei_mutex);
1909
1910 /*
1911 * If we are suspending and the wifi driver hasn't removed it's netdev
1912 * yet, do it now. In any case, don't change the cache.netdev pointer.
1913 */
1914 dev = rcu_dereference_protected(iwl_mei_cache.netdev,
1915 lockdep_is_held(&iwl_mei_mutex));
1916
1917 netdev_rx_handler_unregister(dev);
1918 mutex_unlock(&iwl_mei_mutex);
1919 rtnl_unlock();
1920 }
1921
1922 mutex_lock(&iwl_mei_mutex);
1923
1924 /*
1925 * Tell CSME that we are going down so that it won't access the
1926 * memory anymore, make sure this message goes through immediately.
1927 */
1928 mei->csa_throttled = false;
1929 iwl_mei_send_sap_msg(mei->cldev,
1930 SAP_MSG_NOTIF_HOST_GOES_DOWN);
1931
1932 for (i = 0; i < SEND_SAP_MAX_WAIT_ITERATION; i++) {
1933 if (!iwl_mei_host_to_me_data_pending(mei))
1934 break;
1935
1936 msleep(5);
1937 }
1938
1939 /*
1940 * If we couldn't make sure that CSME saw the HOST_GOES_DOWN message,
1941 * it means that it will probably keep reading memory that we are going
1942 * to unmap and free, expect IOMMU error messages.
1943 */
1944 if (i == SEND_SAP_MAX_WAIT_ITERATION)
1945 dev_err(&mei->cldev->dev,
1946 "Couldn't get ACK from CSME on HOST_GOES_DOWN message\n");
1947
1948 mutex_unlock(&iwl_mei_mutex);
1949
1950 /*
1951 * This looks strange, but this lock is taken here to make sure that
1952 * iwl_mei_add_data_to_ring called from the Tx path sees that we
1953 * clear the IWL_MEI_STATUS_SAP_CONNECTED bit.
1954 * Rx isn't a problem because the rx_handler can't be called after
1955 * having been unregistered.
1956 */
1957 spin_lock_bh(&mei->data_q_lock);
1958 clear_bit(IWL_MEI_STATUS_SAP_CONNECTED, &iwl_mei_status);
1959 spin_unlock_bh(&mei->data_q_lock);
1960
1961 if (iwl_mei_cache.ops)
1962 iwl_mei_cache.ops->rfkill(iwl_mei_cache.priv, false);
1963
1964 /*
1965 * mei_cldev_disable will return only after all the MEI Rx is done.
1966 * It must be called when iwl_mei_mutex is *not* held, since it waits
1967 * for our Rx handler to complete.
1968 * After it returns, no new Rx will start.
1969 */
1970 mei_cldev_disable(cldev);
1971
1972 /*
1973 * Since the netdev was already removed and the netdev's removal
1974 * includes a call to synchronize_net() so that we know there won't be
1975 * any new Rx that will trigger the following workers.
1976 */
1977 cancel_work_sync(&mei->send_csa_msg_wk);
1978 cancel_delayed_work_sync(&mei->csa_throttle_end_wk);
1979
1980 /*
1981 * If someone waits for the ownership, let him know that we are going
1982 * down and that we are not connected anymore. He'll be able to take
1983 * the device.
1984 */
1985 wake_up_all(&mei->get_ownership_wq);
1986
1987 mutex_lock(&iwl_mei_mutex);
1988
1989 iwl_mei_global_cldev = NULL;
1990
1991 wake_up_all(&mei->get_nvm_wq);
1992
1993 iwl_mei_free_shared_mem(cldev);
1994
1995 iwl_mei_dbgfs_unregister(mei);
1996
1997 mei_cldev_set_drvdata(cldev, NULL);
1998
1999 kfree(mei->nvm);
2000
2001 kfree(rcu_access_pointer(mei->filters));
2002
2003 devm_kfree(&cldev->dev, mei);
2004
2005 mutex_unlock(&iwl_mei_mutex);
2006 }
2007
2008 static const struct mei_cl_device_id iwl_mei_tbl[] = {
2009 {
2010 .name = KBUILD_MODNAME,
2011 .uuid = MEI_WLAN_UUID,
2012 .version = MEI_CL_VERSION_ANY,
2013 },
2014
2015 /* required last entry */
2016 { }
2017 };
2018
2019 /*
2020 * Do not export the device table because this module is loaded by
2021 * iwlwifi's dependency.
2022 */
2023
2024 static struct mei_cl_driver iwl_mei_cl_driver = {
2025 .id_table = iwl_mei_tbl,
2026 .name = KBUILD_MODNAME,
2027 .probe = iwl_mei_probe,
2028 .remove = iwl_mei_remove,
2029 };
2030
2031 module_mei_cl_driver(iwl_mei_cl_driver);
2032