Lines Matching refs:wdev
18 static void device_wakeup(struct wfx_dev *wdev)
22 if (!wdev->pdata.gpio_wakeup)
24 if (gpiod_get_value_cansleep(wdev->pdata.gpio_wakeup) > 0)
27 if (wfx_api_older_than(wdev, 1, 4)) {
28 gpiod_set_value_cansleep(wdev->pdata.gpio_wakeup, 1);
29 if (!completion_done(&wdev->hif.ctrl_ready))
34 gpiod_set_value_cansleep(wdev->pdata.gpio_wakeup, 1);
38 if (wait_for_completion_timeout(&wdev->hif.ctrl_ready, msecs_to_jiffies(2))) {
39 complete(&wdev->hif.ctrl_ready);
45 dev_err(wdev->dev, "timeout while wake up chip\n");
46 gpiod_set_value_cansleep(wdev->pdata.gpio_wakeup, 0);
49 dev_err(wdev->dev, "max wake-up retries reached\n");
55 static void device_release(struct wfx_dev *wdev)
57 if (!wdev->pdata.gpio_wakeup)
60 gpiod_set_value_cansleep(wdev->pdata.gpio_wakeup, 0);
63 static int rx_helper(struct wfx_dev *wdev, size_t read_len, int *is_cnf)
75 alloc_len = wdev->hwbus_ops->align_size(wdev->hwbus_priv, read_len + 2);
80 if (wfx_data_read(wdev, skb->data, alloc_len))
93 dev_err(wdev->dev, "inconsistent message length: %zu != %zu\n",
107 WARN(wdev->hif.tx_buffers_used < release_count, "corrupted buffer counter");
108 wdev->hif.tx_buffers_used -= release_count;
110 _trace_hif_recv(hif, wdev->hif.tx_buffers_used);
113 if (hif->seqnum != wdev->hif.rx_seqnum)
114 dev_warn(wdev->dev, "wrong message sequence: %d != %d\n",
115 hif->seqnum, wdev->hif.rx_seqnum);
116 wdev->hif.rx_seqnum = (hif->seqnum + 1) % (HIF_COUNTER_MAX + 1);
121 wfx_handle_rx(wdev, skb);
122 if (!wdev->hif.tx_buffers_used)
123 wake_up(&wdev->hif.tx_buffers_empty);
133 static int bh_work_rx(struct wfx_dev *wdev, int max_msg, int *num_cnf)
143 else if (try_wait_for_completion(&wdev->hif.ctrl_ready))
144 ctrl_reg = atomic_xchg(&wdev->hif.ctrl_reg, 0);
151 piggyback = rx_helper(wdev, len, num_cnf);
155 dev_err(wdev->dev, "unexpected piggyback value: ready bit not set: %04x\n",
159 ctrl_reg = atomic_xchg(&wdev->hif.ctrl_reg, piggyback);
160 complete(&wdev->hif.ctrl_ready);
162 dev_err(wdev->dev, "unexpected IRQ happened: %04x/%04x\n",
168 static void tx_helper(struct wfx_dev *wdev, struct wfx_hif_msg *hif)
177 hif->seqnum = wdev->hif.tx_seqnum;
178 wdev->hif.tx_seqnum = (wdev->hif.tx_seqnum + 1) % (HIF_COUNTER_MAX + 1);
181 WARN(len > le16_to_cpu(wdev->hw_caps.size_inp_ch_buf),
183 len, le16_to_cpu(wdev->hw_caps.size_inp_ch_buf));
184 len = wdev->hwbus_ops->align_size(wdev->hwbus_priv, len);
185 ret = wfx_data_write(wdev, data, len);
189 wdev->hif.tx_buffers_used++;
190 _trace_hif_send(hif, wdev->hif.tx_buffers_used);
196 static int bh_work_tx(struct wfx_dev *wdev, int max_msg)
203 if (wdev->hif.tx_buffers_used < le16_to_cpu(wdev->hw_caps.num_inp_ch_bufs)) {
204 if (try_wait_for_completion(&wdev->hif_cmd.ready)) {
205 WARN(!mutex_is_locked(&wdev->hif_cmd.lock), "data locking error");
206 hif = wdev->hif_cmd.buf_send;
208 hif = wfx_tx_queues_get(wdev);
213 tx_helper(wdev, hif);
222 static void ack_sdio_data(struct wfx_dev *wdev)
226 wfx_config_reg_read(wdev, &cfg_reg);
228 dev_warn(wdev->dev, "chip reports errors: %02x\n", cfg_reg & 0xFF);
229 wfx_config_reg_write_bits(wdev, 0xFF, 0x00);
235 struct wfx_dev *wdev = container_of(work, struct wfx_dev, hif.bh);
240 device_wakeup(wdev);
242 num_tx = bh_work_tx(wdev, 32);
246 num_rx = bh_work_rx(wdev, 32, &stats_cnf);
254 ack_sdio_data(wdev);
255 if (!wdev->hif.tx_buffers_used && !work_pending(work)) {
256 device_release(wdev);
259 _trace_bh_stats(stats_ind, stats_req, stats_cnf, wdev->hif.tx_buffers_used, release_chip);
263 void wfx_bh_request_rx(struct wfx_dev *wdev)
267 wfx_control_reg_read(wdev, &cur);
268 prev = atomic_xchg(&wdev->hif.ctrl_reg, cur);
269 complete(&wdev->hif.ctrl_ready);
270 queue_work(wdev->bh_wq, &wdev->hif.bh);
273 dev_err(wdev->dev, "unexpected control register value: length field is 0: %04x\n",
276 dev_err(wdev->dev, "received IRQ but previous data was not (yet) read: %04x/%04x\n",
281 void wfx_bh_request_tx(struct wfx_dev *wdev)
283 queue_work(wdev->bh_wq, &wdev->hif.bh);
292 void wfx_bh_poll_irq(struct wfx_dev *wdev)
297 WARN(!wdev->poll_irq, "unexpected IRQ polling can mask IRQ");
298 flush_workqueue(wdev->bh_wq);
301 wfx_control_reg_read(wdev, ®);
306 dev_err(wdev->dev, "time out while polling control register\n");
311 wfx_bh_request_rx(wdev);
314 void wfx_bh_register(struct wfx_dev *wdev)
316 INIT_WORK(&wdev->hif.bh, bh_work);
317 init_completion(&wdev->hif.ctrl_ready);
318 init_waitqueue_head(&wdev->hif.tx_buffers_empty);
321 void wfx_bh_unregister(struct wfx_dev *wdev)
323 flush_work(&wdev->hif.bh);