@@ -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+
247260struct 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+
13141337static 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
14951554static int brcmf_msgbuf_stats_read (struct seq_file * seq , void * data )
14961555{
0 commit comments