Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 59338
b: refs/heads/master
c: 3588423
h: refs/heads/master
v: v3
  • Loading branch information
Arthur Jones authored and Roland Dreier committed Jul 10, 2007
1 parent eabf08a commit 5def1f5
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 9ca48655667214be6ebd191628a3c4b5b529a87e
refs/heads/master: 3588423fbab1cfaf839e67378897e232a054f317
23 changes: 23 additions & 0 deletions trunk/drivers/infiniband/hw/ipath/ipath_driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,9 @@ static int __devinit ipath_init_one(struct pci_dev *,
#define PCI_DEVICE_ID_INFINIPATH_HT 0xd
#define PCI_DEVICE_ID_INFINIPATH_PE800 0x10

/* Number of seconds before our card status check... */
#define STATUS_TIMEOUT 60

static const struct pci_device_id ipath_pci_tbl[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_PATHSCALE, PCI_DEVICE_ID_INFINIPATH_HT) },
{ PCI_DEVICE(PCI_VENDOR_ID_PATHSCALE, PCI_DEVICE_ID_INFINIPATH_PE800) },
Expand All @@ -119,6 +122,18 @@ static struct pci_driver ipath_driver = {
.id_table = ipath_pci_tbl,
};

static void ipath_check_status(struct work_struct *work)
{
struct ipath_devdata *dd = container_of(work, struct ipath_devdata,
status_work.work);

/*
* If we don't have any interrupts, let the user know and
* don't bother checking again.
*/
if (dd->ipath_int_counter == 0)
dev_err(&dd->pcidev->dev, "No interrupts detected.\n");
}

static inline void read_bars(struct ipath_devdata *dd, struct pci_dev *dev,
u32 *bar0, u32 *bar1)
Expand Down Expand Up @@ -187,6 +202,8 @@ static struct ipath_devdata *ipath_alloc_devdata(struct pci_dev *pdev)
dd->pcidev = pdev;
pci_set_drvdata(pdev, dd);

INIT_DELAYED_WORK(&dd->status_work, ipath_check_status);

list_add(&dd->ipath_list, &ipath_dev_list);

bail_unlock:
Expand Down Expand Up @@ -511,6 +528,9 @@ static int __devinit ipath_init_one(struct pci_dev *pdev,
ipath_diag_add(dd);
ipath_register_ib_device(dd);

/* Check that card status in STATUS_TIMEOUT seconds. */
schedule_delayed_work(&dd->status_work, HZ * STATUS_TIMEOUT);

goto bail;

bail_irqsetup:
Expand Down Expand Up @@ -638,6 +658,9 @@ static void __devexit ipath_remove_one(struct pci_dev *pdev)
*/
ipath_shutdown_device(dd);

cancel_delayed_work(&dd->status_work);
flush_scheduled_work();

if (dd->verbs_dev)
ipath_unregister_ib_device(dd->verbs_dev);

Expand Down
3 changes: 3 additions & 0 deletions trunk/drivers/infiniband/hw/ipath/ipath_intr.c
Original file line number Diff line number Diff line change
Expand Up @@ -1009,6 +1009,9 @@ irqreturn_t ipath_intr(int irq, void *data)

ipath_stats.sps_ints++;

if (dd->ipath_int_counter != (u32) -1)
dd->ipath_int_counter++;

if (!(dd->ipath_flags & IPATH_PRESENT)) {
/*
* This return value is not great, but we do not want the
Expand Down
5 changes: 5 additions & 0 deletions trunk/drivers/infiniband/hw/ipath/ipath_kernel.h
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,8 @@ struct ipath_devdata {
u32 ipath_lastport_piobuf;
/* is a stats timer active */
u32 ipath_stats_timer_active;
/* number of interrupts for this device -- saturates... */
u32 ipath_int_counter;
/* dwords sent read from counter */
u32 ipath_lastsword;
/* dwords received read from counter */
Expand Down Expand Up @@ -571,6 +573,9 @@ struct ipath_devdata {
u32 ipath_overrun_thresh_errs;
u32 ipath_lli_errs;

/* status check work */
struct delayed_work status_work;

/*
* Not all devices managed by a driver instance are the same
* type, so these fields must be per-device.
Expand Down

0 comments on commit 5def1f5

Please sign in to comment.