On Thu, 21 Jul 2016 14:18:54 -0400 Alexandre Bounine 
<alexandre.boun...@idt.com> wrote:

> Add RapidIO switch driver for IDT Gen3 switch devices: RXS1632 and RXS2448.
> 
> ...
>
> +static int
> +idtg3_em_handler(struct rio_dev *rdev, u8 pnum)
> +{
> +     u32 err_status;
> +     u32 rval;
> +
> +     rio_read_config_32(rdev,
> +                     RIO_DEV_PORT_N_ERR_STS_CSR(rdev, pnum),
> +                     &err_status);
> +
> +     /* Do nothing for device/link removal */
> +     if (err_status & RIO_PORT_N_ERR_STS_PORT_UNINIT)
> +             return 0;
> +
> +     /* When link is OK we have a device insertion.
> +      * Request port soft reset to clear errors if they present.
> +      * Inbound and outbound ackIDs will be 0 after reset.
> +      */
> +     if (err_status & (RIO_PORT_N_ERR_STS_OUT_ES |
> +                             RIO_PORT_N_ERR_STS_INP_ES)) {
> +             rio_read_config_32(rdev, RIO_PLM_SPx_IMP_SPEC_CTL(pnum), &rval);
> +             rio_write_config_32(rdev, RIO_PLM_SPx_IMP_SPEC_CTL(pnum),
> +                                 rval | RIO_PLM_SPx_IMP_SPEC_CTL_SOFT_RST);
> +             udelay(10);
> +             rio_write_config_32(rdev, RIO_PLM_SPx_IMP_SPEC_CTL(pnum), rval);
> +             mdelay(500);

Yikes, that's a very long busywait.  A half-second machine freeze on
uniprocessor (if such exists ;)).  We can't use msleep()?

> +     }
> +
> +     return 0;
> +}
>
> ...
>

Reply via email to