Skip to content

Commit 764dee4

Browse files
LorenzoBianconinbd168
authored andcommitted
mt76: sdio: move common code in mt76_sdio module
Move sdio common code in mt76_sdio module. This is a preliminary patch to support mt7921s devices. Co-developed-by: Sean Wang <[email protected]> Signed-off-by: Sean Wang <[email protected]> Signed-off-by: Lorenzo Bianconi <[email protected]> Signed-off-by: Felix Fietkau <[email protected]>
1 parent f1e2eef commit 764dee4

File tree

9 files changed

+343
-313
lines changed

9 files changed

+343
-313
lines changed

drivers/net/wireless/mediatek/mt76/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ mt76-$(CONFIG_PCI) += pci.o
1414
mt76-$(CONFIG_NL80211_TESTMODE) += testmode.o
1515

1616
mt76-usb-y := usb.o usb_trace.o
17-
mt76-sdio-y := sdio.o
17+
mt76-sdio-y := sdio.o sdio_txrx.o
1818

1919
CFLAGS_trace.o := -I$(src)
2020
CFLAGS_usb_trace.o := -I$(src)

drivers/net/wireless/mediatek/mt76/mt76.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1248,6 +1248,22 @@ int mt76s_init(struct mt76_dev *dev, struct sdio_func *func,
12481248
int mt76s_alloc_rx_queue(struct mt76_dev *dev, enum mt76_rxq_id qid);
12491249
int mt76s_alloc_tx(struct mt76_dev *dev);
12501250
void mt76s_deinit(struct mt76_dev *dev);
1251+
void mt76s_sdio_irq(struct sdio_func *func);
1252+
void mt76s_txrx_worker(struct mt76_sdio *sdio);
1253+
int mt76s_hw_init(struct mt76_dev *dev, struct sdio_func *func);
1254+
u32 mt76s_rr(struct mt76_dev *dev, u32 offset);
1255+
void mt76s_wr(struct mt76_dev *dev, u32 offset, u32 val);
1256+
u32 mt76s_rmw(struct mt76_dev *dev, u32 offset, u32 mask, u32 val);
1257+
u32 mt76s_read_pcr(struct mt76_dev *dev);
1258+
void mt76s_write_copy(struct mt76_dev *dev, u32 offset,
1259+
const void *data, int len);
1260+
void mt76s_read_copy(struct mt76_dev *dev, u32 offset,
1261+
void *data, int len);
1262+
int mt76s_wr_rp(struct mt76_dev *dev, u32 base,
1263+
const struct mt76_reg_pair *data,
1264+
int len);
1265+
int mt76s_rd_rp(struct mt76_dev *dev, u32 base,
1266+
struct mt76_reg_pair *data, int len);
12511267

12521268
struct sk_buff *
12531269
mt76_mcu_msg_alloc(struct mt76_dev *dev, const void *data,

drivers/net/wireless/mediatek/mt76/mt7615/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@ mt7615e-$(CONFIG_MT7622_WMAC) += soc.o
1717

1818
mt7663-usb-sdio-common-y := usb_sdio.o
1919
mt7663u-y := usb.o usb_mcu.o
20-
mt7663s-y := sdio.o sdio_mcu.o sdio_txrx.o
20+
mt7663s-y := sdio.o sdio_mcu.o

drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -569,10 +569,6 @@ int mt7663_usb_sdio_register_device(struct mt7615_dev *dev);
569569
int mt7663u_mcu_init(struct mt7615_dev *dev);
570570

571571
/* sdio */
572-
u32 mt7663s_read_pcr(struct mt7615_dev *dev);
573572
int mt7663s_mcu_init(struct mt7615_dev *dev);
574-
void mt7663s_txrx_worker(struct mt76_worker *w);
575-
void mt7663s_rx_work(struct work_struct *work);
576-
void mt7663s_sdio_irq(struct sdio_func *func);
577573

578574
#endif

drivers/net/wireless/mediatek/mt76/mt7615/sdio.c

Lines changed: 19 additions & 260 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
#include <linux/mmc/sdio_ids.h>
1515
#include <linux/mmc/sdio_func.h>
1616

17+
#include "../sdio.h"
1718
#include "mt7615.h"
18-
#include "sdio.h"
1919
#include "mac.h"
2020
#include "mcu.h"
2121

@@ -24,200 +24,19 @@ static const struct sdio_device_id mt7663s_table[] = {
2424
{ } /* Terminating entry */
2525
};
2626

27-
static u32 mt7663s_read_whisr(struct mt76_dev *dev)
27+
static void mt7663s_txrx_worker(struct mt76_worker *w)
2828
{
29-
return sdio_readl(dev->sdio.func, MCR_WHISR, NULL);
30-
}
31-
32-
u32 mt7663s_read_pcr(struct mt7615_dev *dev)
33-
{
34-
struct mt76_sdio *sdio = &dev->mt76.sdio;
35-
36-
return sdio_readl(sdio->func, MCR_WHLPCR, NULL);
37-
}
38-
39-
static u32 mt7663s_read_mailbox(struct mt76_dev *dev, u32 offset)
40-
{
41-
struct sdio_func *func = dev->sdio.func;
42-
u32 val = ~0, status;
43-
int err;
44-
45-
sdio_claim_host(func);
46-
47-
sdio_writel(func, offset, MCR_H2DSM0R, &err);
48-
if (err < 0) {
49-
dev_err(dev->dev, "failed setting address [err=%d]\n", err);
50-
goto out;
51-
}
52-
53-
sdio_writel(func, H2D_SW_INT_READ, MCR_WSICR, &err);
54-
if (err < 0) {
55-
dev_err(dev->dev, "failed setting read mode [err=%d]\n", err);
56-
goto out;
57-
}
58-
59-
err = readx_poll_timeout(mt7663s_read_whisr, dev, status,
60-
status & H2D_SW_INT_READ, 0, 1000000);
61-
if (err < 0) {
62-
dev_err(dev->dev, "query whisr timeout\n");
63-
goto out;
64-
}
65-
66-
sdio_writel(func, H2D_SW_INT_READ, MCR_WHISR, &err);
67-
if (err < 0) {
68-
dev_err(dev->dev, "failed setting read mode [err=%d]\n", err);
69-
goto out;
70-
}
71-
72-
val = sdio_readl(func, MCR_H2DSM0R, &err);
73-
if (err < 0) {
74-
dev_err(dev->dev, "failed reading h2dsm0r [err=%d]\n", err);
75-
goto out;
76-
}
77-
78-
if (val != offset) {
79-
dev_err(dev->dev, "register mismatch\n");
80-
val = ~0;
81-
goto out;
82-
}
83-
84-
val = sdio_readl(func, MCR_D2HRM1R, &err);
85-
if (err < 0)
86-
dev_err(dev->dev, "failed reading d2hrm1r [err=%d]\n", err);
87-
88-
out:
89-
sdio_release_host(func);
90-
91-
return val;
92-
}
93-
94-
static void mt7663s_write_mailbox(struct mt76_dev *dev, u32 offset, u32 val)
95-
{
96-
struct sdio_func *func = dev->sdio.func;
97-
u32 status;
98-
int err;
99-
100-
sdio_claim_host(func);
101-
102-
sdio_writel(func, offset, MCR_H2DSM0R, &err);
103-
if (err < 0) {
104-
dev_err(dev->dev, "failed setting address [err=%d]\n", err);
105-
goto out;
106-
}
107-
108-
sdio_writel(func, val, MCR_H2DSM1R, &err);
109-
if (err < 0) {
110-
dev_err(dev->dev,
111-
"failed setting write value [err=%d]\n", err);
112-
goto out;
113-
}
114-
115-
sdio_writel(func, H2D_SW_INT_WRITE, MCR_WSICR, &err);
116-
if (err < 0) {
117-
dev_err(dev->dev, "failed setting write mode [err=%d]\n", err);
118-
goto out;
119-
}
120-
121-
err = readx_poll_timeout(mt7663s_read_whisr, dev, status,
122-
status & H2D_SW_INT_WRITE, 0, 1000000);
123-
if (err < 0) {
124-
dev_err(dev->dev, "query whisr timeout\n");
125-
goto out;
126-
}
127-
128-
sdio_writel(func, H2D_SW_INT_WRITE, MCR_WHISR, &err);
129-
if (err < 0) {
130-
dev_err(dev->dev, "failed setting write mode [err=%d]\n", err);
131-
goto out;
132-
}
133-
134-
val = sdio_readl(func, MCR_H2DSM0R, &err);
135-
if (err < 0) {
136-
dev_err(dev->dev, "failed reading h2dsm0r [err=%d]\n", err);
137-
goto out;
138-
}
139-
140-
if (val != offset)
141-
dev_err(dev->dev, "register mismatch\n");
142-
143-
out:
144-
sdio_release_host(func);
145-
}
146-
147-
static u32 mt7663s_rr(struct mt76_dev *dev, u32 offset)
148-
{
149-
if (test_bit(MT76_STATE_MCU_RUNNING, &dev->phy.state))
150-
return dev->mcu_ops->mcu_rr(dev, offset);
151-
else
152-
return mt7663s_read_mailbox(dev, offset);
153-
}
154-
155-
static void mt7663s_wr(struct mt76_dev *dev, u32 offset, u32 val)
156-
{
157-
if (test_bit(MT76_STATE_MCU_RUNNING, &dev->phy.state))
158-
dev->mcu_ops->mcu_wr(dev, offset, val);
159-
else
160-
mt7663s_write_mailbox(dev, offset, val);
161-
}
162-
163-
static u32 mt7663s_rmw(struct mt76_dev *dev, u32 offset, u32 mask, u32 val)
164-
{
165-
val |= mt7663s_rr(dev, offset) & ~mask;
166-
mt7663s_wr(dev, offset, val);
167-
168-
return val;
169-
}
170-
171-
static void mt7663s_write_copy(struct mt76_dev *dev, u32 offset,
172-
const void *data, int len)
173-
{
174-
const u32 *val = data;
175-
int i;
176-
177-
for (i = 0; i < len / sizeof(u32); i++) {
178-
mt7663s_wr(dev, offset, val[i]);
179-
offset += sizeof(u32);
180-
}
181-
}
182-
183-
static void mt7663s_read_copy(struct mt76_dev *dev, u32 offset,
184-
void *data, int len)
185-
{
186-
u32 *val = data;
187-
int i;
188-
189-
for (i = 0; i < len / sizeof(u32); i++) {
190-
val[i] = mt7663s_rr(dev, offset);
191-
offset += sizeof(u32);
192-
}
193-
}
29+
struct mt76_sdio *sdio = container_of(w, struct mt76_sdio,
30+
txrx_worker);
31+
struct mt76_dev *mdev = container_of(sdio, struct mt76_dev, sdio);
32+
struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76);
19433

195-
static int mt7663s_wr_rp(struct mt76_dev *dev, u32 base,
196-
const struct mt76_reg_pair *data,
197-
int len)
198-
{
199-
int i;
200-
201-
for (i = 0; i < len; i++) {
202-
mt7663s_wr(dev, data->reg, data->value);
203-
data++;
204-
}
205-
206-
return 0;
207-
}
208-
209-
static int mt7663s_rd_rp(struct mt76_dev *dev, u32 base,
210-
struct mt76_reg_pair *data,
211-
int len)
212-
{
213-
int i;
214-
215-
for (i = 0; i < len; i++) {
216-
data->value = mt7663s_rr(dev, data->reg);
217-
data++;
34+
if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) {
35+
queue_work(mdev->wq, &dev->pm.wake_work);
36+
return;
21837
}
219-
220-
return 0;
38+
mt76s_txrx_worker(sdio);
39+
mt76_connac_pm_unref(&dev->mphy, &dev->pm);
22140
}
22241

22342
static void mt7663s_init_work(struct work_struct *work)
@@ -231,66 +50,6 @@ static void mt7663s_init_work(struct work_struct *work)
23150
mt7615_init_work(dev);
23251
}
23352

234-
static int mt7663s_hw_init(struct mt7615_dev *dev, struct sdio_func *func)
235-
{
236-
u32 status, ctrl;
237-
int ret;
238-
239-
sdio_claim_host(func);
240-
241-
ret = sdio_enable_func(func);
242-
if (ret < 0)
243-
goto release;
244-
245-
/* Get ownership from the device */
246-
sdio_writel(func, WHLPCR_INT_EN_CLR | WHLPCR_FW_OWN_REQ_CLR,
247-
MCR_WHLPCR, &ret);
248-
if (ret < 0)
249-
goto disable_func;
250-
251-
ret = readx_poll_timeout(mt7663s_read_pcr, dev, status,
252-
status & WHLPCR_IS_DRIVER_OWN, 2000, 1000000);
253-
if (ret < 0) {
254-
dev_err(dev->mt76.dev, "Cannot get ownership from device");
255-
goto disable_func;
256-
}
257-
258-
ret = sdio_set_block_size(func, 512);
259-
if (ret < 0)
260-
goto disable_func;
261-
262-
/* Enable interrupt */
263-
sdio_writel(func, WHLPCR_INT_EN_SET, MCR_WHLPCR, &ret);
264-
if (ret < 0)
265-
goto disable_func;
266-
267-
ctrl = WHIER_RX0_DONE_INT_EN | WHIER_TX_DONE_INT_EN;
268-
sdio_writel(func, ctrl, MCR_WHIER, &ret);
269-
if (ret < 0)
270-
goto disable_func;
271-
272-
/* set WHISR as read clear and Rx aggregation number as 16 */
273-
ctrl = FIELD_PREP(MAX_HIF_RX_LEN_NUM, 16);
274-
sdio_writel(func, ctrl, MCR_WHCR, &ret);
275-
if (ret < 0)
276-
goto disable_func;
277-
278-
ret = sdio_claim_irq(func, mt7663s_sdio_irq);
279-
if (ret < 0)
280-
goto disable_func;
281-
282-
sdio_release_host(func);
283-
284-
return 0;
285-
286-
disable_func:
287-
sdio_disable_func(func);
288-
release:
289-
sdio_release_host(func);
290-
291-
return ret;
292-
}
293-
29453
static int mt7663s_probe(struct sdio_func *func,
29554
const struct sdio_device_id *id)
29655
{
@@ -307,13 +66,13 @@ static int mt7663s_probe(struct sdio_func *func,
30766
.update_survey = mt7615_update_channel,
30867
};
30968
static const struct mt76_bus_ops mt7663s_ops = {
310-
.rr = mt7663s_rr,
311-
.rmw = mt7663s_rmw,
312-
.wr = mt7663s_wr,
313-
.write_copy = mt7663s_write_copy,
314-
.read_copy = mt7663s_read_copy,
315-
.wr_rp = mt7663s_wr_rp,
316-
.rd_rp = mt7663s_rd_rp,
69+
.rr = mt76s_rr,
70+
.rmw = mt76s_rmw,
71+
.wr = mt76s_wr,
72+
.write_copy = mt76s_write_copy,
73+
.read_copy = mt76s_read_copy,
74+
.wr_rp = mt76s_wr_rp,
75+
.rd_rp = mt76s_rd_rp,
31776
.type = MT76_BUS_SDIO,
31877
};
31978
struct ieee80211_ops *ops;
@@ -341,7 +100,7 @@ static int mt7663s_probe(struct sdio_func *func,
341100
if (ret < 0)
342101
goto error;
343102

344-
ret = mt7663s_hw_init(dev, func);
103+
ret = mt76s_hw_init(mdev, func);
345104
if (ret)
346105
goto error;
347106

drivers/net/wireless/mediatek/mt76/mt7615/sdio_mcu.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010
#include <linux/module.h>
1111
#include <linux/iopoll.h>
1212

13+
#include "../sdio.h"
1314
#include "mt7615.h"
1415
#include "mac.h"
1516
#include "mcu.h"
1617
#include "regs.h"
17-
#include "sdio.h"
1818

1919
static int mt7663s_mcu_init_sched(struct mt7615_dev *dev)
2020
{
@@ -63,7 +63,7 @@ static int __mt7663s_mcu_drv_pmctrl(struct mt7615_dev *dev)
6363

6464
sdio_writel(func, WHLPCR_FW_OWN_REQ_CLR, MCR_WHLPCR, NULL);
6565

66-
ret = readx_poll_timeout(mt7663s_read_pcr, dev, status,
66+
ret = readx_poll_timeout(mt76s_read_pcr, &dev->mt76, status,
6767
status & WHLPCR_IS_DRIVER_OWN, 2000, 1000000);
6868
if (ret < 0) {
6969
dev_err(dev->mt76.dev, "Cannot get ownership from device");
@@ -111,7 +111,7 @@ static int mt7663s_mcu_fw_pmctrl(struct mt7615_dev *dev)
111111

112112
sdio_writel(func, WHLPCR_FW_OWN_REQ_SET, MCR_WHLPCR, NULL);
113113

114-
ret = readx_poll_timeout(mt7663s_read_pcr, dev, status,
114+
ret = readx_poll_timeout(mt76s_read_pcr, &dev->mt76, status,
115115
!(status & WHLPCR_IS_DRIVER_OWN), 2000, 1000000);
116116
if (ret < 0) {
117117
dev_err(dev->mt76.dev, "Cannot set ownership to device");

0 commit comments

Comments
 (0)