> +static void ixgbe_reset_prep(struct pci_dev *pdev)
> +{
> +     struct ixgbe_adapter *adapter = pci_get_drvdata(pdev);
> +     unsigned int timeout = IXGBE_PCIE_RESET_RETRIES;
> +
> +     if (!adapter)
> +             return;
> +
> +     /* Prevent the service task from being requeued in the timer callback
> +      * while we're resetting.
> +      */
> +     if (test_bit(__IXGBE_SERVICE_INITED, &adapter->state)) {
> +             timer_delete_sync(&adapter->service_timer);
> +             /* Prevent the service task from running while we're resetting. 
> */
> +             cancel_work_sync(&adapter->service_task);
> +     }
> +
> +     pci_clear_master(pdev);
> +
> +     while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state) && 
> --timeout)
> +             usleep_range(1000, 2000);

Please consider using something from iopoll.h

> +
> +     if (!timeout) {
> +             e_err(drv, "Timed out waiting for __IXGBE_RESETTING to be 
> released. Reset is needed\n");
> +             pci_set_master(pdev);
> +             return;
> +     }

because this is broken. You need to retest the condition before
declaring ETIMEDOUT.

        Andrew

Reply via email to