6666static int asmedia_mbox_tx (struct pci_dev * pdev , u64 data )
6767{
6868 u8 op ;
69- int i ;
69+ int ret , err ;
7070
71- for (i = 0 ; i < TIMEOUT_USEC ; i ++ ) {
72- pci_read_config_byte (pdev , ASMT_CFG_CONTROL , & op );
73- if (!(op & ASMT_CFG_CONTROL_WRITE ))
74- break ;
75- udelay (1 );
76- }
77-
78- if (op & ASMT_CFG_CONTROL_WRITE ) {
79- dev_err (& pdev -> dev ,
80- "Timed out on mailbox tx: 0x%llx\n" ,
81- data );
82- return - ETIMEDOUT ;
71+ ret = read_poll_timeout (pci_read_config_byte , err ,
72+ err || !(op & ASMT_CFG_CONTROL_WRITE ),
73+ 1 , TIMEOUT_USEC , false, pdev , ASMT_CFG_CONTROL ,
74+ & op );
75+ if (ret ) {
76+ dev_err (& pdev -> dev , "Timed out on mailbox tx: 0x%llx\n" , data );
77+ return ret ;
8378 }
79+ if (err )
80+ return err ;
8481
8582 pci_write_config_dword (pdev , ASMT_CFG_DATA_WRITE0 , data );
8683 pci_write_config_dword (pdev , ASMT_CFG_DATA_WRITE1 , data >> 32 );
@@ -93,19 +90,18 @@ static int asmedia_mbox_rx(struct pci_dev *pdev, u64 *data)
9390{
9491 u8 op ;
9592 u32 low , high ;
96- int i ;
93+ int ret , err ;
9794
98- for (i = 0 ; i < TIMEOUT_USEC ; i ++ ) {
99- pci_read_config_byte (pdev , ASMT_CFG_CONTROL , & op );
100- if (op & ASMT_CFG_CONTROL_READ )
101- break ;
102- udelay (1 );
103- }
104-
105- if (!(op & ASMT_CFG_CONTROL_READ )) {
95+ ret = read_poll_timeout (pci_read_config_byte , err ,
96+ err || (op & ASMT_CFG_CONTROL_READ ),
97+ 1 , TIMEOUT_USEC , false, pdev , ASMT_CFG_CONTROL ,
98+ & op );
99+ if (ret ) {
106100 dev_err (& pdev -> dev , "Timed out on mailbox rx\n" );
107- return - ETIMEDOUT ;
101+ return ret ;
108102 }
103+ if (err )
104+ return err ;
109105
110106 pci_read_config_dword (pdev , ASMT_CFG_DATA_READ0 , & low );
111107 pci_read_config_dword (pdev , ASMT_CFG_DATA_READ1 , & high );
@@ -223,8 +219,8 @@ static int asmedia_read_reg(struct usb_hcd *hcd, u16 addr, u8 *val) {
223219
224220static int asmedia_write_reg (struct usb_hcd * hcd , u16 addr , u8 data , bool wait ) {
225221 void __iomem * regs = hcd -> regs ;
226- u8 status ;
227- int ret , i ;
222+ u8 status , val ;
223+ int ret , err ;
228224
229225 writew_relaxed (addr , regs + ASMT_REG_ADDR );
230226
@@ -255,19 +251,19 @@ static int asmedia_write_reg(struct usb_hcd *hcd, u16 addr, u8 data, bool wait)
255251 if (!wait )
256252 return 0 ;
257253
258- for (i = 0 ; i < TIMEOUT_USEC ; i ++ ) {
259- ret = asmedia_read_reg (hcd , addr , & status );
260- if (ret )
261- return ret ;
262- if (status == data )
263- break ;
264- }
265-
266- if (i >= TIMEOUT_USEC ) {
254+ ret = read_poll_timeout (asmedia_read_reg , err , err || val == data ,
255+ 0 , TIMEOUT_USEC , false, hcd , addr , & val );
256+ if (ret ) {
267257 dev_err (hcd -> self .controller ,
268258 "Verify register timed out ([%04x] = %02x)\n" ,
269259 addr , data );
270- return - ETIMEDOUT ;
260+ return ret ;
261+ }
262+ if (err ) {
263+ dev_err (hcd -> self .controller ,
264+ "Verify register read error ([%04x] = %02x)\n" ,
265+ addr , data );
266+ return err ;
271267 }
272268
273269 return 0 ;
@@ -282,7 +278,7 @@ static int asmedia_load_fw(struct pci_dev *pdev, const struct firmware *fw)
282278 u32 data ;
283279 size_t index = 0 , addr = 0 ;
284280 size_t words = fw -> size >> 1 ;
285- int ret , i ;
281+ int ret , err ;
286282
287283 hcd = dev_get_drvdata (& pdev -> dev );
288284 regs = hcd -> regs ;
@@ -328,17 +324,16 @@ static int asmedia_load_fw(struct pci_dev *pdev, const struct firmware *fw)
328324
329325 writel_relaxed (data , regs + ASMT_REG_CODE_WDATA );
330326
331- for (i = 0 ; i < TIMEOUT_USEC ; i ++ ) {
332- pci_read_config_word (pdev , ASMT_CFG_SRAM_ADDR , & raddr );
333- if (raddr != addr )
334- break ;
335- udelay (1 );
336- }
337-
338- if (raddr == addr ) {
327+ ret = read_poll_timeout (pci_read_config_word , err ,
328+ err || (raddr != addr ),
329+ 1 , TIMEOUT_USEC , false, pdev ,
330+ ASMT_CFG_SRAM_ADDR , & raddr );
331+ if (ret ) {
339332 dev_err (hcd -> self .controller , "Word write timed out\n" );
340- return - ETIMEDOUT ;
333+ return ret ;
341334 }
335+ if (err )
336+ return err ;
342337
343338 if (++ index & 0x4000 )
344339 index += 0x4000 ;
0 commit comments