> struct mucse_mbx_info { > + struct mucse_mbx_stats stats; > + u32 timeout; > + u32 usec_delay; > + u16 size; > + u16 fw_req; > + u16 fw_ack; > + /* lock for only one use mbx */ > + struct mutex lock; > /* fw <--> pf mbx */ > u32 fw_pf_shm_base; > u32 pf2fw_mbox_ctrl; > +/** > + * mucse_obtain_mbx_lock_pf - Obtain mailbox lock > + * @hw: pointer to the HW structure > + * > + * This function maybe used in an irq handler. > + * > + * Return: 0 if we obtained the mailbox lock or else -EIO > + **/ > +static int mucse_obtain_mbx_lock_pf(struct mucse_hw *hw) > +{ > + struct mucse_mbx_info *mbx = &hw->mbx; > + int try_cnt = 5000; > + u32 reg; > + > + reg = PF2FW_MBOX_CTRL(mbx); > + while (try_cnt-- > 0) { > + mbx_ctrl_wr32(mbx, reg, MBOX_PF_HOLD); > + /* force write back before check */ > + wmb(); > + if (mbx_ctrl_rd32(mbx, reg) & MBOX_PF_HOLD) > + return 0; > + udelay(100); > + } > + return -EIO; > +} If there is a function which obtains a lock, there is normally a function which releases a lock. But i don't see it. > +void mucse_init_mbx_params_pf(struct mucse_hw *hw) > +{ > + struct mucse_mbx_info *mbx = &hw->mbx; > + > + mbx->usec_delay = 100; > + mbx->timeout = (4 * USEC_PER_SEC) / mbx->usec_delay; > + mbx->stats.msgs_tx = 0; > + mbx->stats.msgs_rx = 0; > + mbx->stats.reqs = 0; > + mbx->stats.acks = 0; > + mbx->size = MUCSE_MAILBOX_BYTES; > + mutex_init(&mbx->lock); And this mutex never seems to be used anywhere. What is it supposed to be protecting? Andrew --- pw-bot: cr