Merge branch 'upstream-fixes' into upstream
This commit is contained in:
commit
cbc696a5fa
|
@ -1905,6 +1905,12 @@ M: James.Bottomley@HansenPartnership.com
|
||||||
L: linux-scsi@vger.kernel.org
|
L: linux-scsi@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
NETEM NETWORK EMULATOR
|
||||||
|
P: Stephen Hemminger
|
||||||
|
M: shemminger@osdl.org
|
||||||
|
L: netem@osdl.org
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
NETFILTER/IPTABLES/IPCHAINS
|
NETFILTER/IPTABLES/IPCHAINS
|
||||||
P: Rusty Russell
|
P: Rusty Russell
|
||||||
P: Marc Boucher
|
P: Marc Boucher
|
||||||
|
|
4
Makefile
4
Makefile
|
@ -1,8 +1,8 @@
|
||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 17
|
SUBLEVEL = 17
|
||||||
EXTRAVERSION =-rc4
|
EXTRAVERSION =-rc5
|
||||||
NAME=Sliding Snow Leopard
|
NAME=Lordi Rules
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
# To see a list of typical targets execute "make help"
|
# To see a list of typical targets execute "make help"
|
||||||
|
|
|
@ -315,3 +315,4 @@ ENTRY(sys_call_table)
|
||||||
.long sys_splice
|
.long sys_splice
|
||||||
.long sys_sync_file_range
|
.long sys_sync_file_range
|
||||||
.long sys_tee /* 315 */
|
.long sys_tee /* 315 */
|
||||||
|
.long sys_vmsplice
|
||||||
|
|
|
@ -463,11 +463,23 @@ static int pmac_pm_finish(suspend_state_t state)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int pmac_pm_valid(suspend_state_t state)
|
||||||
|
{
|
||||||
|
switch (state) {
|
||||||
|
case PM_SUSPEND_DISK:
|
||||||
|
return 1;
|
||||||
|
/* can't do any other states via generic mechanism yet */
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static struct pm_ops pmac_pm_ops = {
|
static struct pm_ops pmac_pm_ops = {
|
||||||
.pm_disk_mode = PM_DISK_SHUTDOWN,
|
.pm_disk_mode = PM_DISK_SHUTDOWN,
|
||||||
.prepare = pmac_pm_prepare,
|
.prepare = pmac_pm_prepare,
|
||||||
.enter = pmac_pm_enter,
|
.enter = pmac_pm_enter,
|
||||||
.finish = pmac_pm_finish,
|
.finish = pmac_pm_finish,
|
||||||
|
.valid = pmac_pm_valid,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* CONFIG_SOFTWARE_SUSPEND */
|
#endif /* CONFIG_SOFTWARE_SUSPEND */
|
||||||
|
|
|
@ -272,7 +272,7 @@ static inline void stop_hz_timer(void)
|
||||||
next = next_timer_interrupt();
|
next = next_timer_interrupt();
|
||||||
do {
|
do {
|
||||||
seq = read_seqbegin_irqsave(&xtime_lock, flags);
|
seq = read_seqbegin_irqsave(&xtime_lock, flags);
|
||||||
timer = (__u64 next) - (__u64 jiffies) + jiffies_64;
|
timer = ((__u64) next) - ((__u64) jiffies) + jiffies_64;
|
||||||
} while (read_seqretry_irqrestore(&xtime_lock, seq, flags));
|
} while (read_seqretry_irqrestore(&xtime_lock, seq, flags));
|
||||||
todval = -1ULL;
|
todval = -1ULL;
|
||||||
/* Be careful about overflows. */
|
/* Be careful about overflows. */
|
||||||
|
|
|
@ -457,10 +457,6 @@ static int __devinit tpm_tis_pnp_init(struct pnp_dev *pnp_dev,
|
||||||
}
|
}
|
||||||
|
|
||||||
vendor = ioread32(chip->vendor.iobase + TPM_DID_VID(0));
|
vendor = ioread32(chip->vendor.iobase + TPM_DID_VID(0));
|
||||||
if ((vendor & 0xFFFF) == 0xFFFF) {
|
|
||||||
rc = -ENODEV;
|
|
||||||
goto out_err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Default timeouts */
|
/* Default timeouts */
|
||||||
chip->vendor.timeout_a = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
|
chip->vendor.timeout_a = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
|
||||||
|
|
|
@ -491,7 +491,7 @@ static struct pci_device_id divil_pci[] = {
|
||||||
|
|
||||||
#define MSR_LBAR_SMB 0x5140000B
|
#define MSR_LBAR_SMB 0x5140000B
|
||||||
|
|
||||||
static int scx200_add_cs553x(void)
|
static __init int scx200_add_cs553x(void)
|
||||||
{
|
{
|
||||||
u32 low, hi;
|
u32 low, hi;
|
||||||
u32 smb_base;
|
u32 smb_base;
|
||||||
|
|
|
@ -1905,19 +1905,19 @@ static void __exit infinipath_cleanup(void)
|
||||||
} else
|
} else
|
||||||
ipath_dbg("irq is 0, not doing free_irq "
|
ipath_dbg("irq is 0, not doing free_irq "
|
||||||
"for unit %u\n", dd->ipath_unit);
|
"for unit %u\n", dd->ipath_unit);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* we check for NULL here, because it's outside
|
||||||
|
* the kregbase check, and we need to call it
|
||||||
|
* after the free_irq. Thus it's possible that
|
||||||
|
* the function pointers were never initialized.
|
||||||
|
*/
|
||||||
|
if (dd->ipath_f_cleanup)
|
||||||
|
/* clean up chip-specific stuff */
|
||||||
|
dd->ipath_f_cleanup(dd);
|
||||||
|
|
||||||
dd->pcidev = NULL;
|
dd->pcidev = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* we check for NULL here, because it's outside the kregbase
|
|
||||||
* check, and we need to call it after the free_irq. Thus
|
|
||||||
* it's possible that the function pointers were never
|
|
||||||
* initialized.
|
|
||||||
*/
|
|
||||||
if (dd->ipath_f_cleanup)
|
|
||||||
/* clean up chip-specific stuff */
|
|
||||||
dd->ipath_f_cleanup(dd);
|
|
||||||
|
|
||||||
spin_lock_irqsave(&ipath_devs_lock, flags);
|
spin_lock_irqsave(&ipath_devs_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -505,11 +505,10 @@ static u8 flash_csum(struct ipath_flash *ifp, int adjust)
|
||||||
* ipath_get_guid - get the GUID from the i2c device
|
* ipath_get_guid - get the GUID from the i2c device
|
||||||
* @dd: the infinipath device
|
* @dd: the infinipath device
|
||||||
*
|
*
|
||||||
* When we add the multi-chip support, we will probably have to add
|
* We have the capability to use the ipath_nguid field, and get
|
||||||
* the ability to use the number of guids field, and get the guid from
|
* the guid from the first chip's flash, to use for all of them.
|
||||||
* the first chip's flash, to use for all of them.
|
|
||||||
*/
|
*/
|
||||||
void ipath_get_guid(struct ipath_devdata *dd)
|
void ipath_get_eeprom_info(struct ipath_devdata *dd)
|
||||||
{
|
{
|
||||||
void *buf;
|
void *buf;
|
||||||
struct ipath_flash *ifp;
|
struct ipath_flash *ifp;
|
||||||
|
|
|
@ -139,7 +139,7 @@ static int ipath_get_base_info(struct ipath_portdata *pd,
|
||||||
kinfo->spi_piosize = dd->ipath_ibmaxlen;
|
kinfo->spi_piosize = dd->ipath_ibmaxlen;
|
||||||
kinfo->spi_mtu = dd->ipath_ibmaxlen; /* maxlen, not ibmtu */
|
kinfo->spi_mtu = dd->ipath_ibmaxlen; /* maxlen, not ibmtu */
|
||||||
kinfo->spi_port = pd->port_port;
|
kinfo->spi_port = pd->port_port;
|
||||||
kinfo->spi_sw_version = IPATH_USER_SWVERSION;
|
kinfo->spi_sw_version = IPATH_KERN_SWVERSION;
|
||||||
kinfo->spi_hw_version = dd->ipath_revision;
|
kinfo->spi_hw_version = dd->ipath_revision;
|
||||||
|
|
||||||
if (copy_to_user(ubase, kinfo, sizeof(*kinfo)))
|
if (copy_to_user(ubase, kinfo, sizeof(*kinfo)))
|
||||||
|
@ -1224,6 +1224,10 @@ static unsigned int ipath_poll(struct file *fp,
|
||||||
|
|
||||||
if (tail == head) {
|
if (tail == head) {
|
||||||
set_bit(IPATH_PORT_WAITING_RCV, &pd->port_flag);
|
set_bit(IPATH_PORT_WAITING_RCV, &pd->port_flag);
|
||||||
|
if(dd->ipath_rhdrhead_intr_off) /* arm rcv interrupt */
|
||||||
|
(void)ipath_write_ureg(dd, ur_rcvhdrhead,
|
||||||
|
dd->ipath_rhdrhead_intr_off
|
||||||
|
| head, pd->port_port);
|
||||||
poll_wait(fp, &pd->port_wait, pt);
|
poll_wait(fp, &pd->port_wait, pt);
|
||||||
|
|
||||||
if (test_bit(IPATH_PORT_WAITING_RCV, &pd->port_flag)) {
|
if (test_bit(IPATH_PORT_WAITING_RCV, &pd->port_flag)) {
|
||||||
|
|
|
@ -607,7 +607,12 @@ static int ipath_ht_boardname(struct ipath_devdata *dd, char *name,
|
||||||
case 4: /* Ponderosa is one of the bringup boards */
|
case 4: /* Ponderosa is one of the bringup boards */
|
||||||
n = "Ponderosa";
|
n = "Ponderosa";
|
||||||
break;
|
break;
|
||||||
case 5: /* HT-460 original production board */
|
case 5:
|
||||||
|
/*
|
||||||
|
* HT-460 original production board; two production levels, with
|
||||||
|
* different serial number ranges. See ipath_ht_early_init() for
|
||||||
|
* case where we enable IPATH_GPIO_INTR for later serial # range.
|
||||||
|
*/
|
||||||
n = "InfiniPath_HT-460";
|
n = "InfiniPath_HT-460";
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
|
@ -642,7 +647,7 @@ static int ipath_ht_boardname(struct ipath_devdata *dd, char *name,
|
||||||
if (n)
|
if (n)
|
||||||
snprintf(name, namelen, "%s", n);
|
snprintf(name, namelen, "%s", n);
|
||||||
|
|
||||||
if (dd->ipath_majrev != 3 || dd->ipath_minrev != 2) {
|
if (dd->ipath_majrev != 3 || (dd->ipath_minrev < 2 || dd->ipath_minrev > 3)) {
|
||||||
/*
|
/*
|
||||||
* This version of the driver only supports the HT-400
|
* This version of the driver only supports the HT-400
|
||||||
* Rev 3.2
|
* Rev 3.2
|
||||||
|
@ -1520,6 +1525,18 @@ static int ipath_ht_early_init(struct ipath_devdata *dd)
|
||||||
*/
|
*/
|
||||||
ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl,
|
ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl,
|
||||||
INFINIPATH_S_ABORT);
|
INFINIPATH_S_ABORT);
|
||||||
|
|
||||||
|
ipath_get_eeprom_info(dd);
|
||||||
|
if(dd->ipath_boardrev == 5 && dd->ipath_serial[0] == '1' &&
|
||||||
|
dd->ipath_serial[1] == '2' && dd->ipath_serial[2] == '8') {
|
||||||
|
/*
|
||||||
|
* Later production HT-460 has same changes as HT-465, so
|
||||||
|
* can use GPIO interrupts. They have serial #'s starting
|
||||||
|
* with 128, rather than 112.
|
||||||
|
*/
|
||||||
|
dd->ipath_flags |= IPATH_GPIO_INTR;
|
||||||
|
dd->ipath_flags &= ~IPATH_POLL_RX_INTR;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -879,7 +879,6 @@ int ipath_init_chip(struct ipath_devdata *dd, int reinit)
|
||||||
|
|
||||||
done:
|
done:
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
ipath_get_guid(dd);
|
|
||||||
*dd->ipath_statusp |= IPATH_STATUS_CHIP_PRESENT;
|
*dd->ipath_statusp |= IPATH_STATUS_CHIP_PRESENT;
|
||||||
if (!dd->ipath_f_intrsetup(dd)) {
|
if (!dd->ipath_f_intrsetup(dd)) {
|
||||||
/* now we can enable all interrupts from the chip */
|
/* now we can enable all interrupts from the chip */
|
||||||
|
|
|
@ -650,7 +650,7 @@ u32 __iomem *ipath_getpiobuf(struct ipath_devdata *, u32 *);
|
||||||
void ipath_init_pe800_funcs(struct ipath_devdata *);
|
void ipath_init_pe800_funcs(struct ipath_devdata *);
|
||||||
/* init HT-400-specific func */
|
/* init HT-400-specific func */
|
||||||
void ipath_init_ht400_funcs(struct ipath_devdata *);
|
void ipath_init_ht400_funcs(struct ipath_devdata *);
|
||||||
void ipath_get_guid(struct ipath_devdata *);
|
void ipath_get_eeprom_info(struct ipath_devdata *);
|
||||||
u64 ipath_snap_cntr(struct ipath_devdata *, ipath_creg);
|
u64 ipath_snap_cntr(struct ipath_devdata *, ipath_creg);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -136,9 +136,7 @@ int ipath_lkey_ok(struct ipath_lkey_table *rkt, struct ipath_sge *isge,
|
||||||
ret = 1;
|
ret = 1;
|
||||||
goto bail;
|
goto bail;
|
||||||
}
|
}
|
||||||
spin_lock(&rkt->lock);
|
|
||||||
mr = rkt->table[(sge->lkey >> (32 - ib_ipath_lkey_table_size))];
|
mr = rkt->table[(sge->lkey >> (32 - ib_ipath_lkey_table_size))];
|
||||||
spin_unlock(&rkt->lock);
|
|
||||||
if (unlikely(mr == NULL || mr->lkey != sge->lkey)) {
|
if (unlikely(mr == NULL || mr->lkey != sge->lkey)) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
goto bail;
|
goto bail;
|
||||||
|
@ -184,8 +182,6 @@ bail:
|
||||||
* @acc: access flags
|
* @acc: access flags
|
||||||
*
|
*
|
||||||
* Return 1 if successful, otherwise 0.
|
* Return 1 if successful, otherwise 0.
|
||||||
*
|
|
||||||
* The QP r_rq.lock should be held.
|
|
||||||
*/
|
*/
|
||||||
int ipath_rkey_ok(struct ipath_ibdev *dev, struct ipath_sge_state *ss,
|
int ipath_rkey_ok(struct ipath_ibdev *dev, struct ipath_sge_state *ss,
|
||||||
u32 len, u64 vaddr, u32 rkey, int acc)
|
u32 len, u64 vaddr, u32 rkey, int acc)
|
||||||
|
@ -196,9 +192,7 @@ int ipath_rkey_ok(struct ipath_ibdev *dev, struct ipath_sge_state *ss,
|
||||||
size_t off;
|
size_t off;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
spin_lock(&rkt->lock);
|
|
||||||
mr = rkt->table[(rkey >> (32 - ib_ipath_lkey_table_size))];
|
mr = rkt->table[(rkey >> (32 - ib_ipath_lkey_table_size))];
|
||||||
spin_unlock(&rkt->lock);
|
|
||||||
if (unlikely(mr == NULL || mr->lkey != rkey)) {
|
if (unlikely(mr == NULL || mr->lkey != rkey)) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
goto bail;
|
goto bail;
|
||||||
|
|
|
@ -872,12 +872,13 @@ static void copy_io(u32 __iomem *piobuf, struct ipath_sge_state *ss,
|
||||||
update_sge(ss, len);
|
update_sge(ss, len);
|
||||||
length -= len;
|
length -= len;
|
||||||
}
|
}
|
||||||
|
/* Update address before sending packet. */
|
||||||
|
update_sge(ss, length);
|
||||||
/* must flush early everything before trigger word */
|
/* must flush early everything before trigger word */
|
||||||
ipath_flush_wc();
|
ipath_flush_wc();
|
||||||
__raw_writel(last, piobuf);
|
__raw_writel(last, piobuf);
|
||||||
/* be sure trigger word is written */
|
/* be sure trigger word is written */
|
||||||
ipath_flush_wc();
|
ipath_flush_wc();
|
||||||
update_sge(ss, length);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -943,17 +944,18 @@ int ipath_verbs_send(struct ipath_devdata *dd, u32 hdrwords,
|
||||||
if (likely(ss->num_sge == 1 && len <= ss->sge.length &&
|
if (likely(ss->num_sge == 1 && len <= ss->sge.length &&
|
||||||
!((unsigned long)ss->sge.vaddr & (sizeof(u32) - 1)))) {
|
!((unsigned long)ss->sge.vaddr & (sizeof(u32) - 1)))) {
|
||||||
u32 w;
|
u32 w;
|
||||||
|
u32 *addr = (u32 *) ss->sge.vaddr;
|
||||||
|
|
||||||
|
/* Update address before sending packet. */
|
||||||
|
update_sge(ss, len);
|
||||||
/* Need to round up for the last dword in the packet. */
|
/* Need to round up for the last dword in the packet. */
|
||||||
w = (len + 3) >> 2;
|
w = (len + 3) >> 2;
|
||||||
__iowrite32_copy(piobuf, ss->sge.vaddr, w - 1);
|
__iowrite32_copy(piobuf, addr, w - 1);
|
||||||
/* must flush early everything before trigger word */
|
/* must flush early everything before trigger word */
|
||||||
ipath_flush_wc();
|
ipath_flush_wc();
|
||||||
__raw_writel(((u32 *) ss->sge.vaddr)[w - 1],
|
__raw_writel(addr[w - 1], piobuf + w - 1);
|
||||||
piobuf + w - 1);
|
|
||||||
/* be sure trigger word is written */
|
/* be sure trigger word is written */
|
||||||
ipath_flush_wc();
|
ipath_flush_wc();
|
||||||
update_sge(ss, len);
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
goto bail;
|
goto bail;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1180,6 +1180,8 @@ static int ipath_pe_early_init(struct ipath_devdata *dd)
|
||||||
*/
|
*/
|
||||||
dd->ipath_rhdrhead_intr_off = 1ULL<<32;
|
dd->ipath_rhdrhead_intr_off = 1ULL<<32;
|
||||||
|
|
||||||
|
ipath_get_eeprom_info(dd);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -375,10 +375,10 @@ static void ipath_error_qp(struct ipath_qp *qp)
|
||||||
|
|
||||||
spin_lock(&dev->pending_lock);
|
spin_lock(&dev->pending_lock);
|
||||||
/* XXX What if its already removed by the timeout code? */
|
/* XXX What if its already removed by the timeout code? */
|
||||||
if (qp->timerwait.next != LIST_POISON1)
|
if (!list_empty(&qp->timerwait))
|
||||||
list_del(&qp->timerwait);
|
list_del_init(&qp->timerwait);
|
||||||
if (qp->piowait.next != LIST_POISON1)
|
if (!list_empty(&qp->piowait))
|
||||||
list_del(&qp->piowait);
|
list_del_init(&qp->piowait);
|
||||||
spin_unlock(&dev->pending_lock);
|
spin_unlock(&dev->pending_lock);
|
||||||
|
|
||||||
wc.status = IB_WC_WR_FLUSH_ERR;
|
wc.status = IB_WC_WR_FLUSH_ERR;
|
||||||
|
@ -427,6 +427,7 @@ static void ipath_error_qp(struct ipath_qp *qp)
|
||||||
int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
||||||
int attr_mask)
|
int attr_mask)
|
||||||
{
|
{
|
||||||
|
struct ipath_ibdev *dev = to_idev(ibqp->device);
|
||||||
struct ipath_qp *qp = to_iqp(ibqp);
|
struct ipath_qp *qp = to_iqp(ibqp);
|
||||||
enum ib_qp_state cur_state, new_state;
|
enum ib_qp_state cur_state, new_state;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
@ -443,6 +444,19 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
||||||
attr_mask))
|
attr_mask))
|
||||||
goto inval;
|
goto inval;
|
||||||
|
|
||||||
|
if (attr_mask & IB_QP_AV)
|
||||||
|
if (attr->ah_attr.dlid == 0 ||
|
||||||
|
attr->ah_attr.dlid >= IPS_MULTICAST_LID_BASE)
|
||||||
|
goto inval;
|
||||||
|
|
||||||
|
if (attr_mask & IB_QP_PKEY_INDEX)
|
||||||
|
if (attr->pkey_index >= ipath_layer_get_npkeys(dev->dd))
|
||||||
|
goto inval;
|
||||||
|
|
||||||
|
if (attr_mask & IB_QP_MIN_RNR_TIMER)
|
||||||
|
if (attr->min_rnr_timer > 31)
|
||||||
|
goto inval;
|
||||||
|
|
||||||
switch (new_state) {
|
switch (new_state) {
|
||||||
case IB_QPS_RESET:
|
case IB_QPS_RESET:
|
||||||
ipath_reset_qp(qp);
|
ipath_reset_qp(qp);
|
||||||
|
@ -457,13 +471,8 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (attr_mask & IB_QP_PKEY_INDEX) {
|
if (attr_mask & IB_QP_PKEY_INDEX)
|
||||||
struct ipath_ibdev *dev = to_idev(ibqp->device);
|
|
||||||
|
|
||||||
if (attr->pkey_index >= ipath_layer_get_npkeys(dev->dd))
|
|
||||||
goto inval;
|
|
||||||
qp->s_pkey_index = attr->pkey_index;
|
qp->s_pkey_index = attr->pkey_index;
|
||||||
}
|
|
||||||
|
|
||||||
if (attr_mask & IB_QP_DEST_QPN)
|
if (attr_mask & IB_QP_DEST_QPN)
|
||||||
qp->remote_qpn = attr->dest_qp_num;
|
qp->remote_qpn = attr->dest_qp_num;
|
||||||
|
@ -479,12 +488,8 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
||||||
if (attr_mask & IB_QP_ACCESS_FLAGS)
|
if (attr_mask & IB_QP_ACCESS_FLAGS)
|
||||||
qp->qp_access_flags = attr->qp_access_flags;
|
qp->qp_access_flags = attr->qp_access_flags;
|
||||||
|
|
||||||
if (attr_mask & IB_QP_AV) {
|
if (attr_mask & IB_QP_AV)
|
||||||
if (attr->ah_attr.dlid == 0 ||
|
|
||||||
attr->ah_attr.dlid >= IPS_MULTICAST_LID_BASE)
|
|
||||||
goto inval;
|
|
||||||
qp->remote_ah_attr = attr->ah_attr;
|
qp->remote_ah_attr = attr->ah_attr;
|
||||||
}
|
|
||||||
|
|
||||||
if (attr_mask & IB_QP_PATH_MTU)
|
if (attr_mask & IB_QP_PATH_MTU)
|
||||||
qp->path_mtu = attr->path_mtu;
|
qp->path_mtu = attr->path_mtu;
|
||||||
|
@ -499,11 +504,8 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
||||||
qp->s_rnr_retry_cnt = qp->s_rnr_retry;
|
qp->s_rnr_retry_cnt = qp->s_rnr_retry;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (attr_mask & IB_QP_MIN_RNR_TIMER) {
|
if (attr_mask & IB_QP_MIN_RNR_TIMER)
|
||||||
if (attr->min_rnr_timer > 31)
|
|
||||||
goto inval;
|
|
||||||
qp->s_min_rnr_timer = attr->min_rnr_timer;
|
qp->s_min_rnr_timer = attr->min_rnr_timer;
|
||||||
}
|
|
||||||
|
|
||||||
if (attr_mask & IB_QP_QKEY)
|
if (attr_mask & IB_QP_QKEY)
|
||||||
qp->qkey = attr->qkey;
|
qp->qkey = attr->qkey;
|
||||||
|
@ -710,10 +712,8 @@ struct ib_qp *ipath_create_qp(struct ib_pd *ibpd,
|
||||||
init_attr->qp_type == IB_QPT_RC ?
|
init_attr->qp_type == IB_QPT_RC ?
|
||||||
ipath_do_rc_send : ipath_do_uc_send,
|
ipath_do_rc_send : ipath_do_uc_send,
|
||||||
(unsigned long)qp);
|
(unsigned long)qp);
|
||||||
qp->piowait.next = LIST_POISON1;
|
INIT_LIST_HEAD(&qp->piowait);
|
||||||
qp->piowait.prev = LIST_POISON2;
|
INIT_LIST_HEAD(&qp->timerwait);
|
||||||
qp->timerwait.next = LIST_POISON1;
|
|
||||||
qp->timerwait.prev = LIST_POISON2;
|
|
||||||
qp->state = IB_QPS_RESET;
|
qp->state = IB_QPS_RESET;
|
||||||
qp->s_wq = swq;
|
qp->s_wq = swq;
|
||||||
qp->s_size = init_attr->cap.max_send_wr + 1;
|
qp->s_size = init_attr->cap.max_send_wr + 1;
|
||||||
|
@ -734,7 +734,7 @@ struct ib_qp *ipath_create_qp(struct ib_pd *ibpd,
|
||||||
ipath_reset_qp(qp);
|
ipath_reset_qp(qp);
|
||||||
|
|
||||||
/* Tell the core driver that the kernel SMA is present. */
|
/* Tell the core driver that the kernel SMA is present. */
|
||||||
if (qp->ibqp.qp_type == IB_QPT_SMI)
|
if (init_attr->qp_type == IB_QPT_SMI)
|
||||||
ipath_layer_set_verbs_flags(dev->dd,
|
ipath_layer_set_verbs_flags(dev->dd,
|
||||||
IPATH_VERBS_KERNEL_SMA);
|
IPATH_VERBS_KERNEL_SMA);
|
||||||
break;
|
break;
|
||||||
|
@ -783,10 +783,10 @@ int ipath_destroy_qp(struct ib_qp *ibqp)
|
||||||
|
|
||||||
/* Make sure the QP isn't on the timeout list. */
|
/* Make sure the QP isn't on the timeout list. */
|
||||||
spin_lock_irqsave(&dev->pending_lock, flags);
|
spin_lock_irqsave(&dev->pending_lock, flags);
|
||||||
if (qp->timerwait.next != LIST_POISON1)
|
if (!list_empty(&qp->timerwait))
|
||||||
list_del(&qp->timerwait);
|
list_del_init(&qp->timerwait);
|
||||||
if (qp->piowait.next != LIST_POISON1)
|
if (!list_empty(&qp->piowait))
|
||||||
list_del(&qp->piowait);
|
list_del_init(&qp->piowait);
|
||||||
spin_unlock_irqrestore(&dev->pending_lock, flags);
|
spin_unlock_irqrestore(&dev->pending_lock, flags);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -855,10 +855,10 @@ void ipath_sqerror_qp(struct ipath_qp *qp, struct ib_wc *wc)
|
||||||
|
|
||||||
spin_lock(&dev->pending_lock);
|
spin_lock(&dev->pending_lock);
|
||||||
/* XXX What if its already removed by the timeout code? */
|
/* XXX What if its already removed by the timeout code? */
|
||||||
if (qp->timerwait.next != LIST_POISON1)
|
if (!list_empty(&qp->timerwait))
|
||||||
list_del(&qp->timerwait);
|
list_del_init(&qp->timerwait);
|
||||||
if (qp->piowait.next != LIST_POISON1)
|
if (!list_empty(&qp->piowait))
|
||||||
list_del(&qp->piowait);
|
list_del_init(&qp->piowait);
|
||||||
spin_unlock(&dev->pending_lock);
|
spin_unlock(&dev->pending_lock);
|
||||||
|
|
||||||
ipath_cq_enter(to_icq(qp->ibqp.send_cq), wc, 1);
|
ipath_cq_enter(to_icq(qp->ibqp.send_cq), wc, 1);
|
||||||
|
|
|
@ -57,7 +57,7 @@ static void ipath_init_restart(struct ipath_qp *qp, struct ipath_swqe *wqe)
|
||||||
qp->s_len = wqe->length - len;
|
qp->s_len = wqe->length - len;
|
||||||
dev = to_idev(qp->ibqp.device);
|
dev = to_idev(qp->ibqp.device);
|
||||||
spin_lock(&dev->pending_lock);
|
spin_lock(&dev->pending_lock);
|
||||||
if (qp->timerwait.next == LIST_POISON1)
|
if (list_empty(&qp->timerwait))
|
||||||
list_add_tail(&qp->timerwait,
|
list_add_tail(&qp->timerwait,
|
||||||
&dev->pending[dev->pending_index]);
|
&dev->pending[dev->pending_index]);
|
||||||
spin_unlock(&dev->pending_lock);
|
spin_unlock(&dev->pending_lock);
|
||||||
|
@ -356,7 +356,7 @@ static inline int ipath_make_rc_req(struct ipath_qp *qp,
|
||||||
if ((int)(qp->s_psn - qp->s_next_psn) > 0)
|
if ((int)(qp->s_psn - qp->s_next_psn) > 0)
|
||||||
qp->s_next_psn = qp->s_psn;
|
qp->s_next_psn = qp->s_psn;
|
||||||
spin_lock(&dev->pending_lock);
|
spin_lock(&dev->pending_lock);
|
||||||
if (qp->timerwait.next == LIST_POISON1)
|
if (list_empty(&qp->timerwait))
|
||||||
list_add_tail(&qp->timerwait,
|
list_add_tail(&qp->timerwait,
|
||||||
&dev->pending[dev->pending_index]);
|
&dev->pending[dev->pending_index]);
|
||||||
spin_unlock(&dev->pending_lock);
|
spin_unlock(&dev->pending_lock);
|
||||||
|
@ -726,8 +726,8 @@ void ipath_restart_rc(struct ipath_qp *qp, u32 psn, struct ib_wc *wc)
|
||||||
*/
|
*/
|
||||||
dev = to_idev(qp->ibqp.device);
|
dev = to_idev(qp->ibqp.device);
|
||||||
spin_lock(&dev->pending_lock);
|
spin_lock(&dev->pending_lock);
|
||||||
if (qp->timerwait.next != LIST_POISON1)
|
if (!list_empty(&qp->timerwait))
|
||||||
list_del(&qp->timerwait);
|
list_del_init(&qp->timerwait);
|
||||||
spin_unlock(&dev->pending_lock);
|
spin_unlock(&dev->pending_lock);
|
||||||
|
|
||||||
if (wqe->wr.opcode == IB_WR_RDMA_READ)
|
if (wqe->wr.opcode == IB_WR_RDMA_READ)
|
||||||
|
@ -886,8 +886,8 @@ static int do_rc_ack(struct ipath_qp *qp, u32 aeth, u32 psn, int opcode)
|
||||||
* just won't find anything to restart if we ACK everything.
|
* just won't find anything to restart if we ACK everything.
|
||||||
*/
|
*/
|
||||||
spin_lock(&dev->pending_lock);
|
spin_lock(&dev->pending_lock);
|
||||||
if (qp->timerwait.next != LIST_POISON1)
|
if (!list_empty(&qp->timerwait))
|
||||||
list_del(&qp->timerwait);
|
list_del_init(&qp->timerwait);
|
||||||
spin_unlock(&dev->pending_lock);
|
spin_unlock(&dev->pending_lock);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1194,8 +1194,7 @@ static inline void ipath_rc_rcv_resp(struct ipath_ibdev *dev,
|
||||||
IB_WR_RDMA_READ))
|
IB_WR_RDMA_READ))
|
||||||
goto ack_done;
|
goto ack_done;
|
||||||
spin_lock(&dev->pending_lock);
|
spin_lock(&dev->pending_lock);
|
||||||
if (qp->s_rnr_timeout == 0 &&
|
if (qp->s_rnr_timeout == 0 && !list_empty(&qp->timerwait))
|
||||||
qp->timerwait.next != LIST_POISON1)
|
|
||||||
list_move_tail(&qp->timerwait,
|
list_move_tail(&qp->timerwait,
|
||||||
&dev->pending[dev->pending_index]);
|
&dev->pending[dev->pending_index]);
|
||||||
spin_unlock(&dev->pending_lock);
|
spin_unlock(&dev->pending_lock);
|
||||||
|
|
|
@ -435,7 +435,7 @@ void ipath_no_bufs_available(struct ipath_qp *qp, struct ipath_ibdev *dev)
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_irqsave(&dev->pending_lock, flags);
|
spin_lock_irqsave(&dev->pending_lock, flags);
|
||||||
if (qp->piowait.next == LIST_POISON1)
|
if (list_empty(&qp->piowait))
|
||||||
list_add_tail(&qp->piowait, &dev->piowait);
|
list_add_tail(&qp->piowait, &dev->piowait);
|
||||||
spin_unlock_irqrestore(&dev->pending_lock, flags);
|
spin_unlock_irqrestore(&dev->pending_lock, flags);
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -464,7 +464,7 @@ static void ipath_ib_timer(void *arg)
|
||||||
last = &dev->pending[dev->pending_index];
|
last = &dev->pending[dev->pending_index];
|
||||||
while (!list_empty(last)) {
|
while (!list_empty(last)) {
|
||||||
qp = list_entry(last->next, struct ipath_qp, timerwait);
|
qp = list_entry(last->next, struct ipath_qp, timerwait);
|
||||||
list_del(&qp->timerwait);
|
list_del_init(&qp->timerwait);
|
||||||
qp->timer_next = resend;
|
qp->timer_next = resend;
|
||||||
resend = qp;
|
resend = qp;
|
||||||
atomic_inc(&qp->refcount);
|
atomic_inc(&qp->refcount);
|
||||||
|
@ -474,7 +474,7 @@ static void ipath_ib_timer(void *arg)
|
||||||
qp = list_entry(last->next, struct ipath_qp, timerwait);
|
qp = list_entry(last->next, struct ipath_qp, timerwait);
|
||||||
if (--qp->s_rnr_timeout == 0) {
|
if (--qp->s_rnr_timeout == 0) {
|
||||||
do {
|
do {
|
||||||
list_del(&qp->timerwait);
|
list_del_init(&qp->timerwait);
|
||||||
tasklet_hi_schedule(&qp->s_task);
|
tasklet_hi_schedule(&qp->s_task);
|
||||||
if (list_empty(last))
|
if (list_empty(last))
|
||||||
break;
|
break;
|
||||||
|
@ -554,7 +554,7 @@ static int ipath_ib_piobufavail(void *arg)
|
||||||
while (!list_empty(&dev->piowait)) {
|
while (!list_empty(&dev->piowait)) {
|
||||||
qp = list_entry(dev->piowait.next, struct ipath_qp,
|
qp = list_entry(dev->piowait.next, struct ipath_qp,
|
||||||
piowait);
|
piowait);
|
||||||
list_del(&qp->piowait);
|
list_del_init(&qp->piowait);
|
||||||
tasklet_hi_schedule(&qp->s_task);
|
tasklet_hi_schedule(&qp->s_task);
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&dev->pending_lock, flags);
|
spin_unlock_irqrestore(&dev->pending_lock, flags);
|
||||||
|
@ -951,6 +951,7 @@ static void *ipath_register_ib_device(int unit, struct ipath_devdata *dd)
|
||||||
idev->dd = dd;
|
idev->dd = dd;
|
||||||
|
|
||||||
strlcpy(dev->name, "ipath%d", IB_DEVICE_NAME_MAX);
|
strlcpy(dev->name, "ipath%d", IB_DEVICE_NAME_MAX);
|
||||||
|
dev->owner = THIS_MODULE;
|
||||||
dev->node_guid = ipath_layer_get_guid(dd);
|
dev->node_guid = ipath_layer_get_guid(dd);
|
||||||
dev->uverbs_abi_ver = IPATH_UVERBS_ABI_VERSION;
|
dev->uverbs_abi_ver = IPATH_UVERBS_ABI_VERSION;
|
||||||
dev->uverbs_cmd_mask =
|
dev->uverbs_cmd_mask =
|
||||||
|
|
|
@ -490,26 +490,7 @@ int mthca_tavor_post_srq_recv(struct ib_srq *ibsrq, struct ib_recv_wr *wr,
|
||||||
|
|
||||||
first_ind = srq->first_free;
|
first_ind = srq->first_free;
|
||||||
|
|
||||||
for (nreq = 0; wr; ++nreq, wr = wr->next) {
|
for (nreq = 0; wr; wr = wr->next) {
|
||||||
if (unlikely(nreq == MTHCA_TAVOR_MAX_WQES_PER_RECV_DB)) {
|
|
||||||
nreq = 0;
|
|
||||||
|
|
||||||
doorbell[0] = cpu_to_be32(first_ind << srq->wqe_shift);
|
|
||||||
doorbell[1] = cpu_to_be32(srq->srqn << 8);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Make sure that descriptors are written
|
|
||||||
* before doorbell is rung.
|
|
||||||
*/
|
|
||||||
wmb();
|
|
||||||
|
|
||||||
mthca_write64(doorbell,
|
|
||||||
dev->kar + MTHCA_RECEIVE_DOORBELL,
|
|
||||||
MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
|
|
||||||
|
|
||||||
first_ind = srq->first_free;
|
|
||||||
}
|
|
||||||
|
|
||||||
ind = srq->first_free;
|
ind = srq->first_free;
|
||||||
|
|
||||||
if (ind < 0) {
|
if (ind < 0) {
|
||||||
|
@ -569,6 +550,26 @@ int mthca_tavor_post_srq_recv(struct ib_srq *ibsrq, struct ib_recv_wr *wr,
|
||||||
|
|
||||||
srq->wrid[ind] = wr->wr_id;
|
srq->wrid[ind] = wr->wr_id;
|
||||||
srq->first_free = next_ind;
|
srq->first_free = next_ind;
|
||||||
|
|
||||||
|
++nreq;
|
||||||
|
if (unlikely(nreq == MTHCA_TAVOR_MAX_WQES_PER_RECV_DB)) {
|
||||||
|
nreq = 0;
|
||||||
|
|
||||||
|
doorbell[0] = cpu_to_be32(first_ind << srq->wqe_shift);
|
||||||
|
doorbell[1] = cpu_to_be32(srq->srqn << 8);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure that descriptors are written
|
||||||
|
* before doorbell is rung.
|
||||||
|
*/
|
||||||
|
wmb();
|
||||||
|
|
||||||
|
mthca_write64(doorbell,
|
||||||
|
dev->kar + MTHCA_RECEIVE_DOORBELL,
|
||||||
|
MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
|
||||||
|
|
||||||
|
first_ind = srq->first_free;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (likely(nreq)) {
|
if (likely(nreq)) {
|
||||||
|
|
|
@ -36,13 +36,10 @@
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This code has been tested on an ads7846 / N770 device.
|
* This code has been heavily tested on a Nokia 770, and lightly
|
||||||
|
* tested on other ads7846 devices (OSK/Mistral, Lubbock).
|
||||||
* Support for ads7843 and ads7845 has only been stubbed in.
|
* Support for ads7843 and ads7845 has only been stubbed in.
|
||||||
*
|
*
|
||||||
* Not yet done: How accurate are the temperature and voltage
|
|
||||||
* readings? (System-specific calibration should support
|
|
||||||
* accuracy of 0.3 degrees C; otherwise it's 2.0 degrees.)
|
|
||||||
*
|
|
||||||
* IRQ handling needs a workaround because of a shortcoming in handling
|
* IRQ handling needs a workaround because of a shortcoming in handling
|
||||||
* edge triggered IRQs on some platforms like the OMAP1/2. These
|
* edge triggered IRQs on some platforms like the OMAP1/2. These
|
||||||
* platforms don't handle the ARM lazy IRQ disabling properly, thus we
|
* platforms don't handle the ARM lazy IRQ disabling properly, thus we
|
||||||
|
@ -248,10 +245,13 @@ static int ads7846_read12_ser(struct device *dev, unsigned command)
|
||||||
|
|
||||||
if (req->msg.status)
|
if (req->msg.status)
|
||||||
status = req->msg.status;
|
status = req->msg.status;
|
||||||
sample = be16_to_cpu(req->sample);
|
|
||||||
sample = sample >> 4;
|
|
||||||
kfree(req);
|
|
||||||
|
|
||||||
|
/* on-wire is a must-ignore bit, a BE12 value, then padding */
|
||||||
|
sample = be16_to_cpu(req->sample);
|
||||||
|
sample = sample >> 3;
|
||||||
|
sample &= 0x0fff;
|
||||||
|
|
||||||
|
kfree(req);
|
||||||
return status ? status : sample;
|
return status ? status : sample;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -336,13 +336,13 @@ static void ads7846_rx(void *ads)
|
||||||
u16 x, y, z1, z2;
|
u16 x, y, z1, z2;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
/* adjust: 12 bit samples (left aligned), built from
|
/* adjust: on-wire is a must-ignore bit, a BE12 value, then padding;
|
||||||
* two 8 bit values writen msb-first.
|
* built from two 8 bit values written msb-first.
|
||||||
*/
|
*/
|
||||||
x = be16_to_cpu(ts->tc.x) >> 4;
|
x = (be16_to_cpu(ts->tc.x) >> 3) & 0x0fff;
|
||||||
y = be16_to_cpu(ts->tc.y) >> 4;
|
y = (be16_to_cpu(ts->tc.y) >> 3) & 0x0fff;
|
||||||
z1 = be16_to_cpu(ts->tc.z1) >> 4;
|
z1 = (be16_to_cpu(ts->tc.z1) >> 3) & 0x0fff;
|
||||||
z2 = be16_to_cpu(ts->tc.z2) >> 4;
|
z2 = (be16_to_cpu(ts->tc.z2) >> 3) & 0x0fff;
|
||||||
|
|
||||||
/* range filtering */
|
/* range filtering */
|
||||||
if (x == MAX_12BIT)
|
if (x == MAX_12BIT)
|
||||||
|
@ -420,7 +420,7 @@ static void ads7846_debounce(void *ads)
|
||||||
|
|
||||||
m = &ts->msg[ts->msg_idx];
|
m = &ts->msg[ts->msg_idx];
|
||||||
t = list_entry(m->transfers.prev, struct spi_transfer, transfer_list);
|
t = list_entry(m->transfers.prev, struct spi_transfer, transfer_list);
|
||||||
val = (*(u16 *)t->rx_buf) >> 3;
|
val = (be16_to_cpu(*(__be16 *)t->rx_buf) >> 3) & 0x0fff;
|
||||||
if (!ts->read_cnt || (abs(ts->last_read - val) > ts->debounce_tol)) {
|
if (!ts->read_cnt || (abs(ts->last_read - val) > ts->debounce_tol)) {
|
||||||
/* Repeat it, if this was the first read or the read
|
/* Repeat it, if this was the first read or the read
|
||||||
* wasn't consistent enough. */
|
* wasn't consistent enough. */
|
||||||
|
@ -469,7 +469,7 @@ static void ads7846_timer(unsigned long handle)
|
||||||
spin_lock_irq(&ts->lock);
|
spin_lock_irq(&ts->lock);
|
||||||
|
|
||||||
if (unlikely(ts->msg_idx && !ts->pendown)) {
|
if (unlikely(ts->msg_idx && !ts->pendown)) {
|
||||||
/* measurment cycle ended */
|
/* measurement cycle ended */
|
||||||
if (!device_suspended(&ts->spi->dev)) {
|
if (!device_suspended(&ts->spi->dev)) {
|
||||||
ts->irq_disabled = 0;
|
ts->irq_disabled = 0;
|
||||||
enable_irq(ts->spi->irq);
|
enable_irq(ts->spi->irq);
|
||||||
|
@ -495,11 +495,10 @@ static irqreturn_t ads7846_irq(int irq, void *handle, struct pt_regs *regs)
|
||||||
spin_lock_irqsave(&ts->lock, flags);
|
spin_lock_irqsave(&ts->lock, flags);
|
||||||
if (likely(ts->get_pendown_state())) {
|
if (likely(ts->get_pendown_state())) {
|
||||||
if (!ts->irq_disabled) {
|
if (!ts->irq_disabled) {
|
||||||
/* REVISIT irq logic for many ARM chips has cloned a
|
/* The ARM do_simple_IRQ() dispatcher doesn't act
|
||||||
* bug wherein disabling an irq in its handler won't
|
* like the other dispatchers: it will report IRQs
|
||||||
* work;(it's disabled lazily, and too late to work.
|
* even after they've been disabled. We work around
|
||||||
* until all their irq logic is fixed, we must shadow
|
* that here. (The "generic irq" framework may help...)
|
||||||
* that state here.
|
|
||||||
*/
|
*/
|
||||||
ts->irq_disabled = 1;
|
ts->irq_disabled = 1;
|
||||||
disable_irq(ts->spi->irq);
|
disable_irq(ts->spi->irq);
|
||||||
|
@ -609,16 +608,20 @@ static int __devinit ads7846_probe(struct spi_device *spi)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* REVISIT when the irq can be triggered active-low, or if for some
|
||||||
|
* reason the touchscreen isn't hooked up, we don't need to access
|
||||||
|
* the pendown state.
|
||||||
|
*/
|
||||||
if (pdata->get_pendown_state == NULL) {
|
if (pdata->get_pendown_state == NULL) {
|
||||||
dev_dbg(&spi->dev, "no get_pendown_state function?\n");
|
dev_dbg(&spi->dev, "no get_pendown_state function?\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We'd set the wordsize to 12 bits ... except that some controllers
|
/* We'd set TX wordsize 8 bits and RX wordsize to 13 bits ... except
|
||||||
* will then treat the 8 bit command words as 12 bits (and drop the
|
* that even if the hardware can do that, the SPI controller driver
|
||||||
* four MSBs of the 12 bit result). Result: inputs must be shifted
|
* may not. So we stick to very-portable 8 bit words, both RX and TX.
|
||||||
* to discard the four garbage LSBs.
|
|
||||||
*/
|
*/
|
||||||
|
spi->bits_per_word = 8;
|
||||||
|
|
||||||
ts = kzalloc(sizeof(struct ads7846), GFP_KERNEL);
|
ts = kzalloc(sizeof(struct ads7846), GFP_KERNEL);
|
||||||
input_dev = input_allocate_device();
|
input_dev = input_allocate_device();
|
||||||
|
@ -772,7 +775,7 @@ static int __devinit ads7846_probe(struct spi_device *spi)
|
||||||
|
|
||||||
if (request_irq(spi->irq, ads7846_irq,
|
if (request_irq(spi->irq, ads7846_irq,
|
||||||
SA_SAMPLE_RANDOM | SA_TRIGGER_FALLING,
|
SA_SAMPLE_RANDOM | SA_TRIGGER_FALLING,
|
||||||
spi->dev.bus_id, ts)) {
|
spi->dev.driver->name, ts)) {
|
||||||
dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq);
|
dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq);
|
||||||
err = -EBUSY;
|
err = -EBUSY;
|
||||||
goto err_free_mem;
|
goto err_free_mem;
|
||||||
|
|
|
@ -5028,8 +5028,10 @@ static int md_notify_reboot(struct notifier_block *this,
|
||||||
printk(KERN_INFO "md: stopping all md devices.\n");
|
printk(KERN_INFO "md: stopping all md devices.\n");
|
||||||
|
|
||||||
ITERATE_MDDEV(mddev,tmp)
|
ITERATE_MDDEV(mddev,tmp)
|
||||||
if (mddev_trylock(mddev))
|
if (mddev_trylock(mddev)) {
|
||||||
do_md_stop (mddev, 1);
|
do_md_stop (mddev, 1);
|
||||||
|
mddev_unlock(mddev);
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* certain more exotic SCSI devices are known to be
|
* certain more exotic SCSI devices are known to be
|
||||||
* volatile wrt too early system reboots. While the
|
* volatile wrt too early system reboots. While the
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
config VIDEO_SAA7146
|
config VIDEO_SAA7146
|
||||||
tristate
|
tristate
|
||||||
select I2C
|
depends on I2C
|
||||||
|
|
||||||
config VIDEO_SAA7146_VV
|
config VIDEO_SAA7146_VV
|
||||||
tristate
|
tristate
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
config DVB_PLUTO2
|
config DVB_PLUTO2
|
||||||
tristate "Pluto2 cards"
|
tristate "Pluto2 cards"
|
||||||
depends on DVB_CORE && PCI && I2C
|
depends on DVB_CORE && PCI && I2C
|
||||||
select I2C
|
|
||||||
select I2C_ALGOBIT
|
select I2C_ALGOBIT
|
||||||
select DVB_TDA1004X
|
select DVB_TDA1004X
|
||||||
help
|
help
|
||||||
|
|
|
@ -353,7 +353,7 @@ static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card)
|
||||||
*/
|
*/
|
||||||
printk(KERN_ERR "%s: unable to select block size for "
|
printk(KERN_ERR "%s: unable to select block size for "
|
||||||
"writing (rb%u wb%u rp%u wp%u)\n",
|
"writing (rb%u wb%u rp%u wp%u)\n",
|
||||||
md->disk->disk_name,
|
mmc_card_id(card),
|
||||||
1 << card->csd.read_blkbits,
|
1 << card->csd.read_blkbits,
|
||||||
1 << card->csd.write_blkbits,
|
1 << card->csd.write_blkbits,
|
||||||
card->csd.read_partial,
|
card->csd.read_partial,
|
||||||
|
|
|
@ -33,7 +33,7 @@ config DONGLE
|
||||||
|
|
||||||
config ESI_DONGLE
|
config ESI_DONGLE
|
||||||
tristate "ESI JetEye PC dongle"
|
tristate "ESI JetEye PC dongle"
|
||||||
depends on DONGLE && IRDA
|
depends on IRTTY_SIR && DONGLE && IRDA
|
||||||
help
|
help
|
||||||
Say Y here if you want to build support for the Extended Systems
|
Say Y here if you want to build support for the Extended Systems
|
||||||
JetEye PC dongle. To compile it as a module, choose M here. The ESI
|
JetEye PC dongle. To compile it as a module, choose M here. The ESI
|
||||||
|
@ -44,7 +44,7 @@ config ESI_DONGLE
|
||||||
|
|
||||||
config ACTISYS_DONGLE
|
config ACTISYS_DONGLE
|
||||||
tristate "ACTiSYS IR-220L and IR220L+ dongle"
|
tristate "ACTiSYS IR-220L and IR220L+ dongle"
|
||||||
depends on DONGLE && IRDA
|
depends on IRTTY_SIR && DONGLE && IRDA
|
||||||
help
|
help
|
||||||
Say Y here if you want to build support for the ACTiSYS IR-220L and
|
Say Y here if you want to build support for the ACTiSYS IR-220L and
|
||||||
IR220L+ dongles. To compile it as a module, choose M here. The
|
IR220L+ dongles. To compile it as a module, choose M here. The
|
||||||
|
@ -55,7 +55,7 @@ config ACTISYS_DONGLE
|
||||||
|
|
||||||
config TEKRAM_DONGLE
|
config TEKRAM_DONGLE
|
||||||
tristate "Tekram IrMate 210B dongle"
|
tristate "Tekram IrMate 210B dongle"
|
||||||
depends on DONGLE && IRDA
|
depends on IRTTY_SIR && DONGLE && IRDA
|
||||||
help
|
help
|
||||||
Say Y here if you want to build support for the Tekram IrMate 210B
|
Say Y here if you want to build support for the Tekram IrMate 210B
|
||||||
dongle. To compile it as a module, choose M here. The Tekram dongle
|
dongle. To compile it as a module, choose M here. The Tekram dongle
|
||||||
|
@ -66,7 +66,7 @@ config TEKRAM_DONGLE
|
||||||
|
|
||||||
config TOIM3232_DONGLE
|
config TOIM3232_DONGLE
|
||||||
tristate "TOIM3232 IrDa dongle"
|
tristate "TOIM3232 IrDa dongle"
|
||||||
depends on DONGLE && IRDA
|
depends on IRTTY_SIR && DONGLE && IRDA
|
||||||
help
|
help
|
||||||
Say Y here if you want to build support for the Vishay/Temic
|
Say Y here if you want to build support for the Vishay/Temic
|
||||||
TOIM3232 and TOIM4232 based dongles.
|
TOIM3232 and TOIM4232 based dongles.
|
||||||
|
@ -74,7 +74,7 @@ config TOIM3232_DONGLE
|
||||||
|
|
||||||
config LITELINK_DONGLE
|
config LITELINK_DONGLE
|
||||||
tristate "Parallax LiteLink dongle"
|
tristate "Parallax LiteLink dongle"
|
||||||
depends on DONGLE && IRDA
|
depends on IRTTY_SIR && DONGLE && IRDA
|
||||||
help
|
help
|
||||||
Say Y here if you want to build support for the Parallax Litelink
|
Say Y here if you want to build support for the Parallax Litelink
|
||||||
dongle. To compile it as a module, choose M here. The Parallax
|
dongle. To compile it as a module, choose M here. The Parallax
|
||||||
|
@ -85,7 +85,7 @@ config LITELINK_DONGLE
|
||||||
|
|
||||||
config MA600_DONGLE
|
config MA600_DONGLE
|
||||||
tristate "Mobile Action MA600 dongle"
|
tristate "Mobile Action MA600 dongle"
|
||||||
depends on DONGLE && IRDA && EXPERIMENTAL
|
depends on IRTTY_SIR && DONGLE && IRDA && EXPERIMENTAL
|
||||||
help
|
help
|
||||||
Say Y here if you want to build support for the Mobile Action MA600
|
Say Y here if you want to build support for the Mobile Action MA600
|
||||||
dongle. To compile it as a module, choose M here. The MA600 dongle
|
dongle. To compile it as a module, choose M here. The MA600 dongle
|
||||||
|
@ -98,7 +98,7 @@ config MA600_DONGLE
|
||||||
|
|
||||||
config GIRBIL_DONGLE
|
config GIRBIL_DONGLE
|
||||||
tristate "Greenwich GIrBIL dongle"
|
tristate "Greenwich GIrBIL dongle"
|
||||||
depends on DONGLE && IRDA && EXPERIMENTAL
|
depends on IRTTY_SIR && DONGLE && IRDA && EXPERIMENTAL
|
||||||
help
|
help
|
||||||
Say Y here if you want to build support for the Greenwich GIrBIL
|
Say Y here if you want to build support for the Greenwich GIrBIL
|
||||||
dongle. If you want to compile it as a module, choose M here.
|
dongle. If you want to compile it as a module, choose M here.
|
||||||
|
@ -109,7 +109,7 @@ config GIRBIL_DONGLE
|
||||||
|
|
||||||
config MCP2120_DONGLE
|
config MCP2120_DONGLE
|
||||||
tristate "Microchip MCP2120"
|
tristate "Microchip MCP2120"
|
||||||
depends on DONGLE && IRDA && EXPERIMENTAL
|
depends on IRTTY_SIR && DONGLE && IRDA && EXPERIMENTAL
|
||||||
help
|
help
|
||||||
Say Y here if you want to build support for the Microchip MCP2120
|
Say Y here if you want to build support for the Microchip MCP2120
|
||||||
dongle. If you want to compile it as a module, choose M here.
|
dongle. If you want to compile it as a module, choose M here.
|
||||||
|
@ -123,7 +123,7 @@ config MCP2120_DONGLE
|
||||||
|
|
||||||
config OLD_BELKIN_DONGLE
|
config OLD_BELKIN_DONGLE
|
||||||
tristate "Old Belkin dongle"
|
tristate "Old Belkin dongle"
|
||||||
depends on DONGLE && IRDA && EXPERIMENTAL
|
depends on IRTTY_SIR && DONGLE && IRDA && EXPERIMENTAL
|
||||||
help
|
help
|
||||||
Say Y here if you want to build support for the Adaptec Airport 1000
|
Say Y here if you want to build support for the Adaptec Airport 1000
|
||||||
and 2000 dongles. If you want to compile it as a module, choose
|
and 2000 dongles. If you want to compile it as a module, choose
|
||||||
|
@ -132,7 +132,7 @@ config OLD_BELKIN_DONGLE
|
||||||
|
|
||||||
config ACT200L_DONGLE
|
config ACT200L_DONGLE
|
||||||
tristate "ACTiSYS IR-200L dongle"
|
tristate "ACTiSYS IR-200L dongle"
|
||||||
depends on DONGLE && IRDA && EXPERIMENTAL
|
depends on IRTTY_SIR && DONGLE && IRDA && EXPERIMENTAL
|
||||||
help
|
help
|
||||||
Say Y here if you want to build support for the ACTiSYS IR-200L
|
Say Y here if you want to build support for the ACTiSYS IR-200L
|
||||||
dongle. If you want to compile it as a module, choose M here.
|
dongle. If you want to compile it as a module, choose M here.
|
||||||
|
|
|
@ -1838,7 +1838,7 @@ struct net_device * __init arlan_probe(int unit)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MODULE
|
#ifdef MODULE
|
||||||
int init_module(void)
|
int __init init_module(void)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
|
@ -1860,7 +1860,7 @@ int init_module(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void cleanup_module(void)
|
void __exit cleanup_module(void)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
|
|
|
@ -4306,7 +4306,7 @@ out:
|
||||||
* Insertion of the module
|
* Insertion of the module
|
||||||
* I'm now quite proud of the multi-device support.
|
* I'm now quite proud of the multi-device support.
|
||||||
*/
|
*/
|
||||||
int init_module(void)
|
int __init init_module(void)
|
||||||
{
|
{
|
||||||
int ret = -EIO; /* Return error if no cards found */
|
int ret = -EIO; /* Return error if no cards found */
|
||||||
int i;
|
int i;
|
||||||
|
|
|
@ -3643,6 +3643,8 @@ static void ata_pio_block(struct ata_port *ap)
|
||||||
|
|
||||||
ata_pio_sector(qc);
|
ata_pio_sector(qc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ata_altstatus(ap); /* flush */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ata_pio_error(struct ata_port *ap)
|
static void ata_pio_error(struct ata_port *ap)
|
||||||
|
@ -3759,11 +3761,14 @@ static void atapi_packet_task(void *_data)
|
||||||
spin_lock_irqsave(&ap->host_set->lock, flags);
|
spin_lock_irqsave(&ap->host_set->lock, flags);
|
||||||
ap->flags &= ~ATA_FLAG_NOINTR;
|
ap->flags &= ~ATA_FLAG_NOINTR;
|
||||||
ata_data_xfer(ap, qc->cdb, qc->dev->cdb_len, 1);
|
ata_data_xfer(ap, qc->cdb, qc->dev->cdb_len, 1);
|
||||||
|
ata_altstatus(ap); /* flush */
|
||||||
|
|
||||||
if (qc->tf.protocol == ATA_PROT_ATAPI_DMA)
|
if (qc->tf.protocol == ATA_PROT_ATAPI_DMA)
|
||||||
ap->ops->bmdma_start(qc); /* initiate bmdma */
|
ap->ops->bmdma_start(qc); /* initiate bmdma */
|
||||||
spin_unlock_irqrestore(&ap->host_set->lock, flags);
|
spin_unlock_irqrestore(&ap->host_set->lock, flags);
|
||||||
} else {
|
} else {
|
||||||
ata_data_xfer(ap, qc->cdb, qc->dev->cdb_len, 1);
|
ata_data_xfer(ap, qc->cdb, qc->dev->cdb_len, 1);
|
||||||
|
ata_altstatus(ap); /* flush */
|
||||||
|
|
||||||
/* PIO commands are handled by polling */
|
/* PIO commands are handled by polling */
|
||||||
ap->hsm_task_state = HSM_ST;
|
ap->hsm_task_state = HSM_ST;
|
||||||
|
|
|
@ -405,7 +405,7 @@ static int s3c24xx_spi_remove(struct platform_device *dev)
|
||||||
|
|
||||||
static int s3c24xx_spi_suspend(struct platform_device *pdev, pm_message_t msg)
|
static int s3c24xx_spi_suspend(struct platform_device *pdev, pm_message_t msg)
|
||||||
{
|
{
|
||||||
struct s3c24xx_spi *hw = platform_get_drvdata(dev);
|
struct s3c24xx_spi *hw = platform_get_drvdata(pdev);
|
||||||
|
|
||||||
clk_disable(hw->clk);
|
clk_disable(hw->clk);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -413,7 +413,7 @@ static int s3c24xx_spi_suspend(struct platform_device *pdev, pm_message_t msg)
|
||||||
|
|
||||||
static int s3c24xx_spi_resume(struct platform_device *pdev)
|
static int s3c24xx_spi_resume(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct s3c24xx_spi *hw = platform_get_drvdata(dev);
|
struct s3c24xx_spi *hw = platform_get_drvdata(pdev);
|
||||||
|
|
||||||
clk_enable(hw->clk);
|
clk_enable(hw->clk);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -416,10 +416,9 @@ affs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
retval = -EIO;
|
|
||||||
bh = affs_bread(sb, old_dentry->d_inode->i_ino);
|
bh = affs_bread(sb, old_dentry->d_inode->i_ino);
|
||||||
if (!bh)
|
if (!bh)
|
||||||
goto done;
|
return -EIO;
|
||||||
|
|
||||||
/* Remove header from its parent directory. */
|
/* Remove header from its parent directory. */
|
||||||
affs_lock_dir(old_dir);
|
affs_lock_dir(old_dir);
|
||||||
|
|
|
@ -542,7 +542,7 @@ add_failed:
|
||||||
static int metapage_releasepage(struct page *page, gfp_t gfp_mask)
|
static int metapage_releasepage(struct page *page, gfp_t gfp_mask)
|
||||||
{
|
{
|
||||||
struct metapage *mp;
|
struct metapage *mp;
|
||||||
int busy = 0;
|
int ret = 1;
|
||||||
unsigned int offset;
|
unsigned int offset;
|
||||||
|
|
||||||
for (offset = 0; offset < PAGE_CACHE_SIZE; offset += PSIZE) {
|
for (offset = 0; offset < PAGE_CACHE_SIZE; offset += PSIZE) {
|
||||||
|
@ -552,30 +552,20 @@ static int metapage_releasepage(struct page *page, gfp_t gfp_mask)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
jfs_info("metapage_releasepage: mp = 0x%p", mp);
|
jfs_info("metapage_releasepage: mp = 0x%p", mp);
|
||||||
if (mp->count || mp->nohomeok) {
|
if (mp->count || mp->nohomeok ||
|
||||||
|
test_bit(META_dirty, &mp->flag)) {
|
||||||
jfs_info("count = %ld, nohomeok = %d", mp->count,
|
jfs_info("count = %ld, nohomeok = %d", mp->count,
|
||||||
mp->nohomeok);
|
mp->nohomeok);
|
||||||
busy = 1;
|
ret = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
wait_on_page_writeback(page);
|
|
||||||
//WARN_ON(test_bit(META_dirty, &mp->flag));
|
|
||||||
if (test_bit(META_dirty, &mp->flag)) {
|
|
||||||
dump_mem("dirty mp in metapage_releasepage", mp,
|
|
||||||
sizeof(struct metapage));
|
|
||||||
dump_mem("page", page, sizeof(struct page));
|
|
||||||
dump_stack();
|
|
||||||
}
|
|
||||||
if (mp->lsn)
|
if (mp->lsn)
|
||||||
remove_from_logsync(mp);
|
remove_from_logsync(mp);
|
||||||
remove_metapage(page, mp);
|
remove_metapage(page, mp);
|
||||||
INCREMENT(mpStat.pagefree);
|
INCREMENT(mpStat.pagefree);
|
||||||
free_metapage(mp);
|
free_metapage(mp);
|
||||||
}
|
}
|
||||||
if (busy)
|
return ret;
|
||||||
return -1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void metapage_invalidatepage(struct page *page, unsigned long offset)
|
static void metapage_invalidatepage(struct page *page, unsigned long offset)
|
||||||
|
|
|
@ -148,6 +148,7 @@ struct termios {
|
||||||
#define HUPCL 00040000
|
#define HUPCL 00040000
|
||||||
|
|
||||||
#define CLOCAL 00100000
|
#define CLOCAL 00100000
|
||||||
|
#define CMSPAR 010000000000 /* mark or space (stick) parity */
|
||||||
#define CRTSCTS 020000000000 /* flow control */
|
#define CRTSCTS 020000000000 /* flow control */
|
||||||
|
|
||||||
/* c_lflag bits */
|
/* c_lflag bits */
|
||||||
|
|
|
@ -153,6 +153,7 @@ struct termios {
|
||||||
#define HUPCL 00040000
|
#define HUPCL 00040000
|
||||||
|
|
||||||
#define CLOCAL 00100000
|
#define CLOCAL 00100000
|
||||||
|
#define CMSPAR 010000000000 /* mark or space (stick) parity */
|
||||||
#define CRTSCTS 020000000000 /* flow control */
|
#define CRTSCTS 020000000000 /* flow control */
|
||||||
|
|
||||||
/* c_lflag bits */
|
/* c_lflag bits */
|
||||||
|
|
|
@ -127,7 +127,7 @@
|
||||||
* sure which should go first, but I bet it won't make much
|
* sure which should go first, but I bet it won't make much
|
||||||
* difference if we are running VLANs. The good news is that
|
* difference if we are running VLANs. The good news is that
|
||||||
* this protocol won't be in the list unless compiled in, so
|
* this protocol won't be in the list unless compiled in, so
|
||||||
* the average user (w/out VLANs) will not be adversly affected.
|
* the average user (w/out VLANs) will not be adversely affected.
|
||||||
* --BLG
|
* --BLG
|
||||||
*
|
*
|
||||||
* 0800 IP
|
* 0800 IP
|
||||||
|
@ -149,7 +149,7 @@ static struct list_head ptype_base[16]; /* 16 way hashed list */
|
||||||
static struct list_head ptype_all; /* Taps */
|
static struct list_head ptype_all; /* Taps */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The @dev_base list is protected by @dev_base_lock and the rtln
|
* The @dev_base list is protected by @dev_base_lock and the rtnl
|
||||||
* semaphore.
|
* semaphore.
|
||||||
*
|
*
|
||||||
* Pure readers hold dev_base_lock for reading.
|
* Pure readers hold dev_base_lock for reading.
|
||||||
|
@ -641,10 +641,12 @@ int dev_valid_name(const char *name)
|
||||||
* @name: name format string
|
* @name: name format string
|
||||||
*
|
*
|
||||||
* Passed a format string - eg "lt%d" it will try and find a suitable
|
* Passed a format string - eg "lt%d" it will try and find a suitable
|
||||||
* id. Not efficient for many devices, not called a lot. The caller
|
* id. It scans list of devices to build up a free map, then chooses
|
||||||
* must hold the dev_base or rtnl lock while allocating the name and
|
* the first empty slot. The caller must hold the dev_base or rtnl lock
|
||||||
* adding the device in order to avoid duplicates. Returns the number
|
* while allocating the name and adding the device in order to avoid
|
||||||
* of the unit assigned or a negative errno code.
|
* duplicates.
|
||||||
|
* Limited to bits_per_byte * page size devices (ie 32K on most platforms).
|
||||||
|
* Returns the number of the unit assigned or a negative errno code.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int dev_alloc_name(struct net_device *dev, const char *name)
|
int dev_alloc_name(struct net_device *dev, const char *name)
|
||||||
|
@ -744,7 +746,7 @@ int dev_change_name(struct net_device *dev, char *newname)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* netdev_features_change - device changes fatures
|
* netdev_features_change - device changes features
|
||||||
* @dev: device to cause notification
|
* @dev: device to cause notification
|
||||||
*
|
*
|
||||||
* Called to indicate a device has changed features.
|
* Called to indicate a device has changed features.
|
||||||
|
@ -2196,7 +2198,7 @@ int netdev_set_master(struct net_device *slave, struct net_device *master)
|
||||||
* @dev: device
|
* @dev: device
|
||||||
* @inc: modifier
|
* @inc: modifier
|
||||||
*
|
*
|
||||||
* Add or remove promsicuity from a device. While the count in the device
|
* Add or remove promiscuity from a device. While the count in the device
|
||||||
* remains above zero the interface remains promiscuous. Once it hits zero
|
* remains above zero the interface remains promiscuous. Once it hits zero
|
||||||
* the device reverts back to normal filtering operation. A negative inc
|
* the device reverts back to normal filtering operation. A negative inc
|
||||||
* value is used to drop promiscuity on the device.
|
* value is used to drop promiscuity on the device.
|
||||||
|
@ -3122,7 +3124,7 @@ EXPORT_SYMBOL(alloc_netdev);
|
||||||
void free_netdev(struct net_device *dev)
|
void free_netdev(struct net_device *dev)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_SYSFS
|
#ifdef CONFIG_SYSFS
|
||||||
/* Compatiablity with error handling in drivers */
|
/* Compatibility with error handling in drivers */
|
||||||
if (dev->reg_state == NETREG_UNINITIALIZED) {
|
if (dev->reg_state == NETREG_UNINITIALIZED) {
|
||||||
kfree((char *)dev - dev->padded);
|
kfree((char *)dev - dev->padded);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -280,10 +280,13 @@ static int inline rt6_check_neigh(struct rt6_info *rt)
|
||||||
{
|
{
|
||||||
struct neighbour *neigh = rt->rt6i_nexthop;
|
struct neighbour *neigh = rt->rt6i_nexthop;
|
||||||
int m = 0;
|
int m = 0;
|
||||||
if (neigh) {
|
if (rt->rt6i_flags & RTF_NONEXTHOP ||
|
||||||
|
!(rt->rt6i_flags & RTF_GATEWAY))
|
||||||
|
m = 1;
|
||||||
|
else if (neigh) {
|
||||||
read_lock_bh(&neigh->lock);
|
read_lock_bh(&neigh->lock);
|
||||||
if (neigh->nud_state & NUD_VALID)
|
if (neigh->nud_state & NUD_VALID)
|
||||||
m = 1;
|
m = 2;
|
||||||
read_unlock_bh(&neigh->lock);
|
read_unlock_bh(&neigh->lock);
|
||||||
}
|
}
|
||||||
return m;
|
return m;
|
||||||
|
@ -292,15 +295,18 @@ static int inline rt6_check_neigh(struct rt6_info *rt)
|
||||||
static int rt6_score_route(struct rt6_info *rt, int oif,
|
static int rt6_score_route(struct rt6_info *rt, int oif,
|
||||||
int strict)
|
int strict)
|
||||||
{
|
{
|
||||||
int m = rt6_check_dev(rt, oif);
|
int m, n;
|
||||||
|
|
||||||
|
m = rt6_check_dev(rt, oif);
|
||||||
if (!m && (strict & RT6_SELECT_F_IFACE))
|
if (!m && (strict & RT6_SELECT_F_IFACE))
|
||||||
return -1;
|
return -1;
|
||||||
#ifdef CONFIG_IPV6_ROUTER_PREF
|
#ifdef CONFIG_IPV6_ROUTER_PREF
|
||||||
m |= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(rt->rt6i_flags)) << 2;
|
m |= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(rt->rt6i_flags)) << 2;
|
||||||
#endif
|
#endif
|
||||||
if (rt6_check_neigh(rt))
|
n = rt6_check_neigh(rt);
|
||||||
|
if (n > 1)
|
||||||
m |= 16;
|
m |= 16;
|
||||||
else if (strict & RT6_SELECT_F_REACHABLE)
|
else if (!n && strict & RT6_SELECT_F_REACHABLE)
|
||||||
return -1;
|
return -1;
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue