Skip to content

Commit ab927fb

Browse files
committed
wifi: brcmfmac: Implement the H2D/D2H mailbox data commonring messages
Newer firmware versions use these to exchange mailbox data, instead of the hardware mailbox registers. Add handling for them to msgbuf.c. Signed-off-by: Hector Martin <[email protected]>
1 parent 9b704da commit ab927fb

2 files changed

Lines changed: 60 additions & 0 deletions

File tree

drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,19 @@ struct msgbuf_flowring_flush_resp {
244244
__le32 rsvd0[3];
245245
};
246246

247+
struct msgbuf_h2d_mailbox_data {
248+
struct msgbuf_common_hdr msg;
249+
__le32 data;
250+
__le32 rsvd0[7];
251+
};
252+
253+
struct msgbuf_d2h_mailbox_data {
254+
struct msgbuf_common_hdr msg;
255+
struct msgbuf_completion_hdr compl_hdr;
256+
__le32 data;
257+
__le32 rsvd0[2];
258+
};
259+
247260
struct brcmf_msgbuf_work_item {
248261
struct list_head queue;
249262
u32 flowid;
@@ -1311,6 +1324,16 @@ brcmf_msgbuf_process_flow_ring_delete_response(struct brcmf_msgbuf *msgbuf,
13111324
}
13121325

13131326

1327+
static void brcmf_msgbuf_process_d2h_mailbox_data(struct brcmf_msgbuf *msgbuf,
1328+
void *buf)
1329+
{
1330+
struct msgbuf_d2h_mailbox_data *d2h_mb_data = buf;
1331+
struct brcmf_pub *drvr = msgbuf->drvr;
1332+
1333+
brcmf_bus_d2h_mb_rx(drvr->bus_if, le32_to_cpu(d2h_mb_data->data));
1334+
}
1335+
1336+
13141337
static void brcmf_msgbuf_process_msgtype(struct brcmf_msgbuf *msgbuf, void *buf)
13151338
{
13161339
struct brcmf_pub *drvr = msgbuf->drvr;
@@ -1353,6 +1376,10 @@ static void brcmf_msgbuf_process_msgtype(struct brcmf_msgbuf *msgbuf, void *buf)
13531376
brcmf_dbg(MSGBUF, "MSGBUF_TYPE_RX_CMPLT\n");
13541377
brcmf_msgbuf_process_rx_complete(msgbuf, buf);
13551378
break;
1379+
case MSGBUF_TYPE_D2H_MAILBOX_DATA:
1380+
brcmf_dbg(MSGBUF, "MSGBUF_TYPE_D2H_MAILBOX_DATA\n");
1381+
brcmf_msgbuf_process_d2h_mailbox_data(msgbuf, buf);
1382+
break;
13561383
default:
13571384
bphy_err(drvr, "Unsupported msgtype %d\n", msg->msgtype);
13581385
break;
@@ -1491,6 +1518,38 @@ void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u16 flowid)
14911518
}
14921519
}
14931520

1521+
1522+
int brcmf_msgbuf_h2d_mb_write(struct brcmf_pub *drvr, u32 data)
1523+
{
1524+
struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd;
1525+
struct brcmf_commonring *commonring;
1526+
struct msgbuf_h2d_mailbox_data *request;
1527+
void *ret_ptr;
1528+
int err;
1529+
1530+
commonring = msgbuf->commonrings[BRCMF_H2D_MSGRING_CONTROL_SUBMIT];
1531+
brcmf_commonring_lock(commonring);
1532+
ret_ptr = brcmf_commonring_reserve_for_write(commonring);
1533+
if (!ret_ptr) {
1534+
bphy_err(drvr, "Failed to reserve space in commonring\n");
1535+
brcmf_commonring_unlock(commonring);
1536+
return -ENOMEM;
1537+
}
1538+
1539+
request = (struct msgbuf_h2d_mailbox_data *)ret_ptr;
1540+
request->msg.msgtype = MSGBUF_TYPE_H2D_MAILBOX_DATA;
1541+
request->msg.ifidx = -1;
1542+
request->msg.flags = 0;
1543+
request->msg.request_id = 0;
1544+
request->data = data;
1545+
1546+
err = brcmf_commonring_write_complete(commonring);
1547+
brcmf_commonring_unlock(commonring);
1548+
1549+
return err;
1550+
}
1551+
1552+
14941553
#ifdef DEBUG
14951554
static int brcmf_msgbuf_stats_read(struct seq_file *seq, void *data)
14961555
{

drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ int brcmf_proto_msgbuf_rx_trigger(struct device *dev);
3232
void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u16 flowid);
3333
int brcmf_proto_msgbuf_attach(struct brcmf_pub *drvr);
3434
void brcmf_proto_msgbuf_detach(struct brcmf_pub *drvr);
35+
int brcmf_msgbuf_h2d_mb_write(struct brcmf_pub *drvr, u32 data);
3536
#else
3637
static inline int brcmf_proto_msgbuf_attach(struct brcmf_pub *drvr)
3738
{

0 commit comments

Comments
 (0)