@@ -19,17 +19,20 @@ static const u16 msgs_offset = ALIGN(sizeof(struct mbox_hdr), MBOX_MSG_ALIGN);
19
19
20
20
void otx2_mbox_reset (struct otx2_mbox * mbox , int devid )
21
21
{
22
+ void * hw_mbase = mbox -> hwbase + (devid * MBOX_SIZE );
22
23
struct otx2_mbox_dev * mdev = & mbox -> dev [devid ];
23
24
struct mbox_hdr * tx_hdr , * rx_hdr ;
24
25
25
- tx_hdr = mdev -> mbase + mbox -> tx_start ;
26
- rx_hdr = mdev -> mbase + mbox -> rx_start ;
26
+ tx_hdr = hw_mbase + mbox -> tx_start ;
27
+ rx_hdr = hw_mbase + mbox -> rx_start ;
27
28
28
29
spin_lock (& mdev -> mbox_lock );
29
30
mdev -> msg_size = 0 ;
30
31
mdev -> rsp_size = 0 ;
31
32
tx_hdr -> num_msgs = 0 ;
33
+ tx_hdr -> msg_size = 0 ;
32
34
rx_hdr -> num_msgs = 0 ;
35
+ rx_hdr -> msg_size = 0 ;
33
36
spin_unlock (& mdev -> mbox_lock );
34
37
}
35
38
EXPORT_SYMBOL (otx2_mbox_reset );
@@ -133,16 +136,17 @@ EXPORT_SYMBOL(otx2_mbox_init);
133
136
134
137
int otx2_mbox_wait_for_rsp (struct otx2_mbox * mbox , int devid )
135
138
{
139
+ unsigned long timeout = jiffies + msecs_to_jiffies (MBOX_RSP_TIMEOUT );
136
140
struct otx2_mbox_dev * mdev = & mbox -> dev [devid ];
137
- int timeout = 0 , sleep = 1 ;
141
+ struct device * sender = & mbox -> pdev -> dev ;
138
142
139
- while (mdev -> num_msgs != mdev -> msgs_acked ) {
140
- msleep (sleep );
141
- timeout += sleep ;
142
- if (timeout >= MBOX_RSP_TIMEOUT )
143
- return - EIO ;
143
+ while (!time_after (jiffies , timeout )) {
144
+ if (mdev -> num_msgs == mdev -> msgs_acked )
145
+ return 0 ;
146
+ usleep_range (800 , 1000 );
144
147
}
145
- return 0 ;
148
+ dev_dbg (sender , "timed out while waiting for rsp\n" );
149
+ return - EIO ;
146
150
}
147
151
EXPORT_SYMBOL (otx2_mbox_wait_for_rsp );
148
152
@@ -162,13 +166,25 @@ EXPORT_SYMBOL(otx2_mbox_busy_poll_for_rsp);
162
166
163
167
void otx2_mbox_msg_send (struct otx2_mbox * mbox , int devid )
164
168
{
169
+ void * hw_mbase = mbox -> hwbase + (devid * MBOX_SIZE );
165
170
struct otx2_mbox_dev * mdev = & mbox -> dev [devid ];
166
171
struct mbox_hdr * tx_hdr , * rx_hdr ;
167
172
168
- tx_hdr = mdev -> mbase + mbox -> tx_start ;
169
- rx_hdr = mdev -> mbase + mbox -> rx_start ;
173
+ tx_hdr = hw_mbase + mbox -> tx_start ;
174
+ rx_hdr = hw_mbase + mbox -> rx_start ;
175
+
176
+ /* If bounce buffer is implemented copy mbox messages from
177
+ * bounce buffer to hw mbox memory.
178
+ */
179
+ if (mdev -> mbase != hw_mbase )
180
+ memcpy (hw_mbase + mbox -> tx_start + msgs_offset ,
181
+ mdev -> mbase + mbox -> tx_start + msgs_offset ,
182
+ mdev -> msg_size );
170
183
171
184
spin_lock (& mdev -> mbox_lock );
185
+
186
+ tx_hdr -> msg_size = mdev -> msg_size ;
187
+
172
188
/* Reset header for next messages */
173
189
mdev -> msg_size = 0 ;
174
190
mdev -> rsp_size = 0 ;
@@ -215,7 +231,7 @@ struct mbox_msghdr *otx2_mbox_alloc_msg_rsp(struct otx2_mbox *mbox, int devid,
215
231
msghdr = mdev -> mbase + mbox -> tx_start + msgs_offset + mdev -> msg_size ;
216
232
217
233
/* Clear the whole msg region */
218
- memset (msghdr , 0 , sizeof ( * msghdr ) + size );
234
+ memset (msghdr , 0 , size );
219
235
/* Init message header with reset values */
220
236
msghdr -> ver = OTX2_MBOX_VERSION ;
221
237
mdev -> msg_size += size ;
0 commit comments