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 ) {
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 ) {
7976 dev_err (& pdev -> dev ,
8077 "Timed out on mailbox tx: 0x%llx\n" ,
8178 data );
82- return - ETIMEDOUT ;
79+ return ret ;
8380 }
81+ if (err )
82+ return err ;
8483
8584 pci_write_config_dword (pdev , ASMT_CFG_DATA_WRITE0 , data );
8685 pci_write_config_dword (pdev , ASMT_CFG_DATA_WRITE1 , data >> 32 );
@@ -93,19 +92,18 @@ static int asmedia_mbox_rx(struct pci_dev *pdev, u64 *data)
9392{
9493 u8 op ;
9594 u32 low , high ;
96- int i ;
95+ int ret , err ;
9796
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 )) {
97+ ret = read_poll_timeout (pci_read_config_byte , err ,
98+ err || (op & ASMT_CFG_CONTROL_READ ),
99+ 1 , TIMEOUT_USEC , false, pdev , ASMT_CFG_CONTROL ,
100+ & op );
101+ if (ret ) {
106102 dev_err (& pdev -> dev , "Timed out on mailbox rx\n" );
107- return - ETIMEDOUT ;
103+ return ret ;
108104 }
105+ if (err )
106+ return err ;
109107
110108 pci_read_config_dword (pdev , ASMT_CFG_DATA_READ0 , & low );
111109 pci_read_config_dword (pdev , ASMT_CFG_DATA_READ1 , & high );
@@ -223,8 +221,8 @@ static int asmedia_read_reg(struct usb_hcd *hcd, u16 addr, u8 *val) {
223221
224222static int asmedia_write_reg (struct usb_hcd * hcd , u16 addr , u8 data , bool wait ) {
225223 void __iomem * regs = hcd -> regs ;
226- u8 status ;
227- int ret , i ;
224+ u8 status , val ;
225+ int ret , err ;
228226
229227 writew_relaxed (addr , regs + ASMT_REG_ADDR );
230228
@@ -255,19 +253,19 @@ static int asmedia_write_reg(struct usb_hcd *hcd, u16 addr, u8 data, bool wait)
255253 if (!wait )
256254 return 0 ;
257255
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 ) {
256+ ret = read_poll_timeout (asmedia_read_reg , err , err || val == data ,
257+ 0 , TIMEOUT_USEC , false, hcd , addr , & val );
258+ if (ret ) {
267259 dev_err (hcd -> self .controller ,
268260 "Verify register timed out ([%04x] = %02x)\n" ,
269261 addr , data );
270- return - ETIMEDOUT ;
262+ return ret ;
263+ }
264+ if (err ) {
265+ dev_err (hcd -> self .controller ,
266+ "Verify register read error ([%04x] = %02x)\n" ,
267+ addr , data );
268+ return err ;
271269 }
272270
273271 return 0 ;
@@ -282,7 +280,7 @@ static int asmedia_load_fw(struct pci_dev *pdev, const struct firmware *fw)
282280 u32 data ;
283281 size_t index = 0 , addr = 0 ;
284282 size_t words = fw -> size >> 1 ;
285- int ret , i ;
283+ int ret , err ;
286284
287285 hcd = dev_get_drvdata (& pdev -> dev );
288286 regs = hcd -> regs ;
@@ -328,17 +326,16 @@ static int asmedia_load_fw(struct pci_dev *pdev, const struct firmware *fw)
328326
329327 writel_relaxed (data , regs + ASMT_REG_CODE_WDATA );
330328
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 ) {
329+ ret = read_poll_timeout (pci_read_config_word , err ,
330+ err || (raddr != addr ),
331+ 1 , TIMEOUT_USEC , false, pdev ,
332+ ASMT_CFG_SRAM_ADDR , & raddr );
333+ if (ret ) {
339334 dev_err (hcd -> self .controller , "Word write timed out\n" );
340- return - ETIMEDOUT ;
335+ return ret ;
341336 }
337+ if (err )
338+ return err ;
342339
343340 if (++ index & 0x4000 )
344341 index += 0x4000 ;
0 commit comments