forked from Minki/linux
IB/ipath: Fix some issues with buffer cancel and sendctrl register update
There was confused use of INFINIPATH_S_PIOBUFAVAILUPD (value) and IPATH_S_PIOBUFAVAILUPD (bit position). Also, some callers of ipath_cancel_sends() need kr_sendctrl restored, and some want to do it later. Signed-off-by: Dave Olson <dave.olson@qlogic.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
parent
cf5b60aa40
commit
3810f2a84e
@ -740,7 +740,7 @@ void ipath_disarm_piobufs(struct ipath_devdata *dd, unsigned first,
|
||||
* pioavail updates to memory to stop.
|
||||
*/
|
||||
ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl,
|
||||
sendorig & ~IPATH_S_PIOBUFAVAILUPD);
|
||||
sendorig & ~INFINIPATH_S_PIOBUFAVAILUPD);
|
||||
sendorig = ipath_read_kreg64(dd, dd->ipath_kregs->kr_scratch);
|
||||
ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl,
|
||||
dd->ipath_sendctrl);
|
||||
@ -1614,7 +1614,7 @@ int ipath_waitfor_mdio_cmdready(struct ipath_devdata *dd)
|
||||
* it's safer to always do it.
|
||||
* PIOAvail bits are updated by the chip as if normal send had happened.
|
||||
*/
|
||||
void ipath_cancel_sends(struct ipath_devdata *dd)
|
||||
void ipath_cancel_sends(struct ipath_devdata *dd, int restore_sendctrl)
|
||||
{
|
||||
ipath_dbg("Cancelling all in-progress send buffers\n");
|
||||
dd->ipath_lastcancel = jiffies+HZ/2; /* skip armlaunch errs a bit */
|
||||
@ -1627,6 +1627,9 @@ void ipath_cancel_sends(struct ipath_devdata *dd)
|
||||
ipath_read_kreg64(dd, dd->ipath_kregs->kr_scratch);
|
||||
ipath_disarm_piobufs(dd, 0,
|
||||
(unsigned)(dd->ipath_piobcnt2k + dd->ipath_piobcnt4k));
|
||||
if (restore_sendctrl) /* else done by caller later */
|
||||
ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl,
|
||||
dd->ipath_sendctrl);
|
||||
|
||||
/* and again, be sure all have hit the chip */
|
||||
ipath_read_kreg64(dd, dd->ipath_kregs->kr_scratch);
|
||||
@ -1655,7 +1658,7 @@ static void ipath_set_ib_lstate(struct ipath_devdata *dd, int which)
|
||||
/* flush all queued sends when going to DOWN or INIT, to be sure that
|
||||
* they don't block MAD packets */
|
||||
if (!linkcmd || linkcmd == INFINIPATH_IBCC_LINKCMD_INIT)
|
||||
ipath_cancel_sends(dd);
|
||||
ipath_cancel_sends(dd, 1);
|
||||
|
||||
ipath_write_kreg(dd, dd->ipath_kregs->kr_ibcctrl,
|
||||
dd->ipath_ibcctrl | which);
|
||||
@ -2000,7 +2003,7 @@ void ipath_shutdown_device(struct ipath_devdata *dd)
|
||||
|
||||
ipath_set_ib_lstate(dd, INFINIPATH_IBCC_LINKINITCMD_DISABLE <<
|
||||
INFINIPATH_IBCC_LINKINITCMD_SHIFT);
|
||||
ipath_cancel_sends(dd);
|
||||
ipath_cancel_sends(dd, 0);
|
||||
|
||||
/* disable IBC */
|
||||
dd->ipath_control &= ~INFINIPATH_C_LINKENABLE;
|
||||
|
@ -782,7 +782,7 @@ int ipath_init_chip(struct ipath_devdata *dd, int reinit)
|
||||
* Follows early_init because some chips have to initialize
|
||||
* PIO buffers in early_init to avoid false parity errors.
|
||||
*/
|
||||
ipath_cancel_sends(dd);
|
||||
ipath_cancel_sends(dd, 0);
|
||||
|
||||
/* early_init sets rcvhdrentsize and rcvhdrsize, so this must be
|
||||
* done after early_init */
|
||||
|
@ -303,7 +303,7 @@ static void handle_e_ibstatuschanged(struct ipath_devdata *dd,
|
||||
* Flush all queued sends when link went to DOWN or INIT,
|
||||
* to be sure that they don't block SMA and other MAD packets
|
||||
*/
|
||||
ipath_cancel_sends(dd);
|
||||
ipath_cancel_sends(dd, 1);
|
||||
}
|
||||
else if (lstate == IPATH_IBSTATE_INIT || lstate == IPATH_IBSTATE_ARM ||
|
||||
lstate == IPATH_IBSTATE_ACTIVE) {
|
||||
@ -799,13 +799,13 @@ void ipath_clear_freeze(struct ipath_devdata *dd)
|
||||
* therefore would not be sent, and eventually
|
||||
* might cause the process to run out of bufs
|
||||
*/
|
||||
ipath_cancel_sends(dd);
|
||||
ipath_cancel_sends(dd, 0);
|
||||
ipath_write_kreg(dd, dd->ipath_kregs->kr_control,
|
||||
dd->ipath_control);
|
||||
|
||||
/* ensure pio avail updates continue */
|
||||
ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl,
|
||||
dd->ipath_sendctrl & ~IPATH_S_PIOBUFAVAILUPD);
|
||||
dd->ipath_sendctrl & ~INFINIPATH_S_PIOBUFAVAILUPD);
|
||||
ipath_read_kreg64(dd, dd->ipath_kregs->kr_scratch);
|
||||
ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl,
|
||||
dd->ipath_sendctrl);
|
||||
|
@ -683,7 +683,7 @@ int ipath_unordered_wc(void);
|
||||
|
||||
void ipath_disarm_piobufs(struct ipath_devdata *, unsigned first,
|
||||
unsigned cnt);
|
||||
void ipath_cancel_sends(struct ipath_devdata *);
|
||||
void ipath_cancel_sends(struct ipath_devdata *, int);
|
||||
|
||||
int ipath_create_rcvhdrq(struct ipath_devdata *, struct ipath_portdata *);
|
||||
void ipath_free_pddata(struct ipath_devdata *, struct ipath_portdata *);
|
||||
|
Loading…
Reference in New Issue
Block a user