Commit 94f5a00d authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6:
  sis190: scheduling while atomic error
  sis190: mdio operation failure is not correctly detected
  sis190: remove duplicate INIT_WORK
  sis190: add cmos ram access code for the SiS19x/968 chipset pair
  [INET]: Fix truesize setting in ip_append_data
  [NETNS]: Re-export init_net via EXPORT_SYMBOL.
  iwlwifi: fix possible read attempt on ucode that is not available
  [IPV4]: Add missing skb->truesize increment in ip_append_page().
  [TULIP] DMFE: Fix SROM parsing regression.
  [BLUETOOTH]: Move children of connection device to NULL before connection down.
parents eab99d9b b334349e
...@@ -372,7 +372,7 @@ static void __mdio_cmd(void __iomem *ioaddr, u32 ctl) ...@@ -372,7 +372,7 @@ static void __mdio_cmd(void __iomem *ioaddr, u32 ctl)
msleep(1); msleep(1);
} }
if (i > 999) if (i > 99)
printk(KERN_ERR PFX "PHY command failed !\n"); printk(KERN_ERR PFX "PHY command failed !\n");
} }
...@@ -847,10 +847,8 @@ static void sis190_soft_reset(void __iomem *ioaddr) ...@@ -847,10 +847,8 @@ static void sis190_soft_reset(void __iomem *ioaddr)
{ {
SIS_W32(IntrControl, 0x8000); SIS_W32(IntrControl, 0x8000);
SIS_PCI_COMMIT(); SIS_PCI_COMMIT();
msleep(1);
SIS_W32(IntrControl, 0x0); SIS_W32(IntrControl, 0x0);
sis190_asic_down(ioaddr); sis190_asic_down(ioaddr);
msleep(1);
} }
static void sis190_hw_start(struct net_device *dev) static void sis190_hw_start(struct net_device *dev)
...@@ -1041,8 +1039,6 @@ static int sis190_open(struct net_device *dev) ...@@ -1041,8 +1039,6 @@ static int sis190_open(struct net_device *dev)
if (rc < 0) if (rc < 0)
goto err_free_rx_1; goto err_free_rx_1;
INIT_WORK(&tp->phy_task, sis190_phy_task);
sis190_request_timer(dev); sis190_request_timer(dev);
rc = request_irq(dev->irq, sis190_interrupt, IRQF_SHARED, dev->name, dev); rc = request_irq(dev->irq, sis190_interrupt, IRQF_SHARED, dev->name, dev);
...@@ -1549,28 +1545,31 @@ static int __devinit sis190_get_mac_addr_from_eeprom(struct pci_dev *pdev, ...@@ -1549,28 +1545,31 @@ static int __devinit sis190_get_mac_addr_from_eeprom(struct pci_dev *pdev,
} }
/** /**
* sis190_get_mac_addr_from_apc - Get MAC address for SiS965 model * sis190_get_mac_addr_from_apc - Get MAC address for SiS96x model
* @pdev: PCI device * @pdev: PCI device
* @dev: network device to get address for * @dev: network device to get address for
* *
* SiS965 model, use APC CMOS RAM to store MAC address. * SiS96x model, use APC CMOS RAM to store MAC address.
* APC CMOS RAM is accessed through ISA bridge. * APC CMOS RAM is accessed through ISA bridge.
* MAC address is read into @net_dev->dev_addr. * MAC address is read into @net_dev->dev_addr.
*/ */
static int __devinit sis190_get_mac_addr_from_apc(struct pci_dev *pdev, static int __devinit sis190_get_mac_addr_from_apc(struct pci_dev *pdev,
struct net_device *dev) struct net_device *dev)
{ {
static const u16 __devinitdata ids[] = { 0x0965, 0x0966, 0x0968 };
struct sis190_private *tp = netdev_priv(dev); struct sis190_private *tp = netdev_priv(dev);
struct pci_dev *isa_bridge; struct pci_dev *isa_bridge;
u8 reg, tmp8; u8 reg, tmp8;
int i; unsigned int i;
net_probe(tp, KERN_INFO "%s: Read MAC address from APC.\n", net_probe(tp, KERN_INFO "%s: Read MAC address from APC.\n",
pci_name(pdev)); pci_name(pdev));
isa_bridge = pci_get_device(PCI_VENDOR_ID_SI, 0x0965, NULL); for (i = 0; i < ARRAY_SIZE(ids); i++) {
if (!isa_bridge) isa_bridge = pci_get_device(PCI_VENDOR_ID_SI, ids[i], NULL);
isa_bridge = pci_get_device(PCI_VENDOR_ID_SI, 0x0966, NULL); if (isa_bridge)
break;
}
if (!isa_bridge) { if (!isa_bridge) {
net_probe(tp, KERN_INFO "%s: Can not find ISA bridge.\n", net_probe(tp, KERN_INFO "%s: Can not find ISA bridge.\n",
......
...@@ -1909,7 +1909,7 @@ static void dmfe_parse_srom(struct dmfe_board_info * db) ...@@ -1909,7 +1909,7 @@ static void dmfe_parse_srom(struct dmfe_board_info * db)
if ( ( (int) srom[18] & 0xff) == SROM_V41_CODE) { if ( ( (int) srom[18] & 0xff) == SROM_V41_CODE) {
/* SROM V4.01 */ /* SROM V4.01 */
/* Get NIC support media mode */ /* Get NIC support media mode */
db->NIC_capability = le16_to_cpup((__le16 *)srom + 34/2); db->NIC_capability = le16_to_cpup((__le16 *) (srom + 34));
db->PHY_reg4 = 0; db->PHY_reg4 = 0;
for (tmp_reg = 1; tmp_reg < 0x10; tmp_reg <<= 1) { for (tmp_reg = 1; tmp_reg < 0x10; tmp_reg <<= 1) {
switch( db->NIC_capability & tmp_reg ) { switch( db->NIC_capability & tmp_reg ) {
...@@ -1921,8 +1921,8 @@ static void dmfe_parse_srom(struct dmfe_board_info * db) ...@@ -1921,8 +1921,8 @@ static void dmfe_parse_srom(struct dmfe_board_info * db)
} }
/* Media Mode Force or not check */ /* Media Mode Force or not check */
dmfe_mode = le32_to_cpup((__le32 *)srom + 34/4) & dmfe_mode = (le32_to_cpup((__le32 *) (srom + 34)) &
le32_to_cpup((__le32 *)srom + 36/4); le32_to_cpup((__le32 *) (srom + 36)));
switch(dmfe_mode) { switch(dmfe_mode) {
case 0x4: dmfe_media_mode = DMFE_100MHF; break; /* 100MHF */ case 0x4: dmfe_media_mode = DMFE_100MHF; break; /* 100MHF */
case 0x2: dmfe_media_mode = DMFE_10MFD; break; /* 10MFD */ case 0x2: dmfe_media_mode = DMFE_10MFD; break; /* 10MFD */
......
...@@ -6342,6 +6342,11 @@ static int __iwl_up(struct iwl_priv *priv) ...@@ -6342,6 +6342,11 @@ static int __iwl_up(struct iwl_priv *priv)
return 0; return 0;
} }
if (!priv->ucode_data_backup.v_addr || !priv->ucode_data.v_addr) {
IWL_ERROR("ucode not available for device bringup\n");
return -EIO;
}
iwl_write32(priv, CSR_INT, 0xFFFFFFFF); iwl_write32(priv, CSR_INT, 0xFFFFFFFF);
rc = iwl_hw_nic_init(priv); rc = iwl_hw_nic_init(priv);
......
...@@ -6698,6 +6698,11 @@ static int __iwl_up(struct iwl_priv *priv) ...@@ -6698,6 +6698,11 @@ static int __iwl_up(struct iwl_priv *priv)
return 0; return 0;
} }
if (!priv->ucode_data_backup.v_addr || !priv->ucode_data.v_addr) {
IWL_ERROR("ucode not available for device bringup\n");
return -EIO;
}
iwl_write32(priv, CSR_INT, 0xFFFFFFFF); iwl_write32(priv, CSR_INT, 0xFFFFFFFF);
rc = iwl_hw_nic_init(priv); rc = iwl_hw_nic_init(priv);
......
...@@ -316,9 +316,26 @@ void hci_conn_add_sysfs(struct hci_conn *conn) ...@@ -316,9 +316,26 @@ void hci_conn_add_sysfs(struct hci_conn *conn)
schedule_work(&conn->work); schedule_work(&conn->work);
} }
static int __match_tty(struct device *dev, void *data)
{
/* The rfcomm tty device will possibly retain even when conn
* is down, and sysfs doesn't support move zombie device,
* so we should move the device before conn device is destroyed.
* Due to the only child device of hci_conn dev is rfcomm
* tty_dev, here just return 1
*/
return 1;
}
static void del_conn(struct work_struct *work) static void del_conn(struct work_struct *work)
{ {
struct device *dev;
struct hci_conn *conn = container_of(work, struct hci_conn, work); struct hci_conn *conn = container_of(work, struct hci_conn, work);
while (dev = device_find_child(&conn->dev, NULL, __match_tty)) {
device_move(dev, NULL);
put_device(dev);
}
device_del(&conn->dev); device_del(&conn->dev);
put_device(&conn->dev); put_device(&conn->dev);
} }
......
...@@ -696,6 +696,7 @@ static void rfcomm_tty_close(struct tty_struct *tty, struct file *filp) ...@@ -696,6 +696,7 @@ static void rfcomm_tty_close(struct tty_struct *tty, struct file *filp)
BT_DBG("tty %p dev %p dlc %p opened %d", tty, dev, dev->dlc, dev->opened); BT_DBG("tty %p dev %p dlc %p opened %d", tty, dev, dev->dlc, dev->opened);
if (--dev->opened == 0) { if (--dev->opened == 0) {
if (dev->tty_dev->parent)
device_move(dev->tty_dev, NULL); device_move(dev->tty_dev, NULL);
/* Close DLC and dettach TTY */ /* Close DLC and dettach TTY */
......
...@@ -18,7 +18,7 @@ static DEFINE_MUTEX(net_mutex); ...@@ -18,7 +18,7 @@ static DEFINE_MUTEX(net_mutex);
LIST_HEAD(net_namespace_list); LIST_HEAD(net_namespace_list);
struct net init_net; struct net init_net;
EXPORT_SYMBOL_GPL(init_net); EXPORT_SYMBOL(init_net);
/* /*
* setup_net runs the initializers for the network namespace object. * setup_net runs the initializers for the network namespace object.
......
...@@ -1016,8 +1016,6 @@ alloc_new_skb: ...@@ -1016,8 +1016,6 @@ alloc_new_skb:
skb_fill_page_desc(skb, i, page, 0, 0); skb_fill_page_desc(skb, i, page, 0, 0);
frag = &skb_shinfo(skb)->frags[i]; frag = &skb_shinfo(skb)->frags[i];
skb->truesize += PAGE_SIZE;
atomic_add(PAGE_SIZE, &sk->sk_wmem_alloc);
} else { } else {
err = -EMSGSIZE; err = -EMSGSIZE;
goto error; goto error;
...@@ -1030,6 +1028,8 @@ alloc_new_skb: ...@@ -1030,6 +1028,8 @@ alloc_new_skb:
frag->size += copy; frag->size += copy;
skb->len += copy; skb->len += copy;
skb->data_len += copy; skb->data_len += copy;
skb->truesize += copy;
atomic_add(copy, &sk->sk_wmem_alloc);
} }
offset += copy; offset += copy;
length -= copy; length -= copy;
...@@ -1172,6 +1172,8 @@ ssize_t ip_append_page(struct sock *sk, struct page *page, ...@@ -1172,6 +1172,8 @@ ssize_t ip_append_page(struct sock *sk, struct page *page,
skb->len += len; skb->len += len;
skb->data_len += len; skb->data_len += len;
skb->truesize += len;
atomic_add(len, &sk->sk_wmem_alloc);
offset += len; offset += len;
size -= len; size -= len;
} }
......
...@@ -1316,8 +1316,6 @@ alloc_new_skb: ...@@ -1316,8 +1316,6 @@ alloc_new_skb:
skb_fill_page_desc(skb, i, page, 0, 0); skb_fill_page_desc(skb, i, page, 0, 0);
frag = &skb_shinfo(skb)->frags[i]; frag = &skb_shinfo(skb)->frags[i];
skb->truesize += PAGE_SIZE;
atomic_add(PAGE_SIZE, &sk->sk_wmem_alloc);
} else { } else {
err = -EMSGSIZE; err = -EMSGSIZE;
goto error; goto error;
...@@ -1330,6 +1328,8 @@ alloc_new_skb: ...@@ -1330,6 +1328,8 @@ alloc_new_skb:
frag->size += copy; frag->size += copy;
skb->len += copy; skb->len += copy;
skb->data_len += copy; skb->data_len += copy;
skb->truesize += copy;
atomic_add(copy, &sk->sk_wmem_alloc);
} }
offset += copy; offset += copy;
length -= copy; length -= copy;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment