|
47 | 47 | #define MSGBUF_TYPE_RX_CMPLT 0x12 |
48 | 48 | #define MSGBUF_TYPE_LPBK_DMAXFER 0x13 |
49 | 49 | #define MSGBUF_TYPE_LPBK_DMAXFER_CMPLT 0x14 |
| 50 | +#define MSGBUF_TYPE_FLOW_RING_RESUME 0x15 |
| 51 | +#define MSGBUF_TYPE_FLOW_RING_RESUME_CMPLT 0x16 |
| 52 | +#define MSGBUF_TYPE_FLOW_RING_SUSPEND 0x17 |
| 53 | +#define MSGBUF_TYPE_FLOW_RING_SUSPEND_CMPLT 0x18 |
| 54 | +#define MSGBUF_TYPE_INFO_BUF_POST 0x19 |
| 55 | +#define MSGBUF_TYPE_INFO_BUF_CMPLT 0x1A |
| 56 | +#define MSGBUF_TYPE_H2D_RING_CREATE 0x1B |
| 57 | +#define MSGBUF_TYPE_D2H_RING_CREATE 0x1C |
| 58 | +#define MSGBUF_TYPE_H2D_RING_CREATE_CMPLT 0x1D |
| 59 | +#define MSGBUF_TYPE_D2H_RING_CREATE_CMPLT 0x1E |
| 60 | +#define MSGBUF_TYPE_H2D_RING_CONFIG 0x1F |
| 61 | +#define MSGBUF_TYPE_D2H_RING_CONFIG 0x20 |
| 62 | +#define MSGBUF_TYPE_H2D_RING_CONFIG_CMPLT 0x21 |
| 63 | +#define MSGBUF_TYPE_D2H_RING_CONFIG_CMPLT 0x22 |
| 64 | +#define MSGBUF_TYPE_H2D_MAILBOX_DATA 0x23 |
| 65 | +#define MSGBUF_TYPE_D2H_MAILBOX_DATA 0x24 |
| 66 | +#define MSGBUF_TYPE_TIMSTAMP_BUFPOST 0x25 |
| 67 | +#define MSGBUF_TYPE_HOSTTIMSTAMP 0x26 |
| 68 | +#define MSGBUF_TYPE_HOSTTIMSTAMP_CMPLT 0x27 |
| 69 | +#define MSGBUF_TYPE_FIRMWARE_TIMESTAMP 0x28 |
| 70 | +#define MSGBUF_TYPE_SNAPSHOT_UPLOAD 0x29 |
| 71 | +#define MSGBUF_TYPE_SNAPSHOT_CMPLT 0x2A |
| 72 | +#define MSGBUF_TYPE_H2D_RING_DELETE 0x2B |
| 73 | +#define MSGBUF_TYPE_D2H_RING_DELETE 0x2C |
| 74 | +#define MSGBUF_TYPE_H2D_RING_DELETE_CMPLT 0x2D |
| 75 | +#define MSGBUF_TYPE_D2H_RING_DELETE_CMPLT 0x2E |
50 | 76 |
|
51 | 77 | #define NR_TX_PKTIDS 2048 |
52 | 78 | #define NR_RX_PKTIDS 1024 |
@@ -218,6 +244,19 @@ struct msgbuf_flowring_flush_resp { |
218 | 244 | __le32 rsvd0[3]; |
219 | 245 | }; |
220 | 246 |
|
| 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 | + |
221 | 260 | struct brcmf_msgbuf_work_item { |
222 | 261 | struct list_head queue; |
223 | 262 | u32 flowid; |
@@ -1285,6 +1324,16 @@ brcmf_msgbuf_process_flow_ring_delete_response(struct brcmf_msgbuf *msgbuf, |
1285 | 1324 | } |
1286 | 1325 |
|
1287 | 1326 |
|
| 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 | + |
1288 | 1337 | static void brcmf_msgbuf_process_msgtype(struct brcmf_msgbuf *msgbuf, void *buf) |
1289 | 1338 | { |
1290 | 1339 | struct brcmf_pub *drvr = msgbuf->drvr; |
@@ -1327,6 +1376,10 @@ static void brcmf_msgbuf_process_msgtype(struct brcmf_msgbuf *msgbuf, void *buf) |
1327 | 1376 | brcmf_dbg(MSGBUF, "MSGBUF_TYPE_RX_CMPLT\n"); |
1328 | 1377 | brcmf_msgbuf_process_rx_complete(msgbuf, buf); |
1329 | 1378 | 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; |
1330 | 1383 | default: |
1331 | 1384 | bphy_err(drvr, "Unsupported msgtype %d\n", msg->msgtype); |
1332 | 1385 | break; |
@@ -1465,6 +1518,38 @@ void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u16 flowid) |
1465 | 1518 | } |
1466 | 1519 | } |
1467 | 1520 |
|
| 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 | + |
1468 | 1553 | #ifdef DEBUG |
1469 | 1554 | static int brcmf_msgbuf_stats_read(struct seq_file *seq, void *data) |
1470 | 1555 | { |
|
0 commit comments