Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 130138
b: refs/heads/master
c: 9e9fd12
h: refs/heads/master
v: v3
  • Loading branch information
Matt Carlson authored and David S. Miller committed Jan 20, 2009
1 parent 0ca3db8 commit a8ab9ab
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 32 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 1da100bb47ef32cb43bb6a365f64183898f830b5
refs/heads/master: 9e9fd12dc0679643c191fc9795a3021807e77de4
81 changes: 50 additions & 31 deletions trunk/drivers/net/tg3.c
Original file line number Diff line number Diff line change
Expand Up @@ -7535,11 +7535,58 @@ static int tg3_test_msi(struct tg3 *tp)
return err;
}

static int tg3_request_firmware(struct tg3 *tp)
{
const __be32 *fw_data;

if (request_firmware(&tp->fw, tp->fw_needed, &tp->pdev->dev)) {
printk(KERN_ERR "%s: Failed to load firmware \"%s\"\n",
tp->dev->name, tp->fw_needed);
return -ENOENT;
}

fw_data = (void *)tp->fw->data;

/* Firmware blob starts with version numbers, followed by
* start address and _full_ length including BSS sections
* (which must be longer than the actual data, of course
*/

tp->fw_len = be32_to_cpu(fw_data[2]); /* includes bss */
if (tp->fw_len < (tp->fw->size - 12)) {
printk(KERN_ERR "%s: bogus length %d in \"%s\"\n",
tp->dev->name, tp->fw_len, tp->fw_needed);
release_firmware(tp->fw);
tp->fw = NULL;
return -EINVAL;
}

/* We no longer need firmware; we have it. */
tp->fw_needed = NULL;
return 0;
}

static int tg3_open(struct net_device *dev)
{
struct tg3 *tp = netdev_priv(dev);
int err;

if (tp->fw_needed) {
err = tg3_request_firmware(tp);
if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0) {
if (err)
return err;
} else if (err) {
printk(KERN_WARNING "%s: TSO capability disabled.\n",
tp->dev->name);
tp->tg3_flags2 &= ~TG3_FLG2_TSO_CAPABLE;
} else if (!(tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE)) {
printk(KERN_NOTICE "%s: TSO capability restored.\n",
tp->dev->name);
tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE;
}
}

netif_carrier_off(tp->dev);

err = tg3_set_power_state(tp, PCI_D0);
Expand Down Expand Up @@ -12934,7 +12981,6 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
struct net_device *dev;
struct tg3 *tp;
int err, pm_cap;
const char *fw_name = NULL;
char str[40];
u64 dma_mask, persist_dma_mask;

Expand Down Expand Up @@ -13091,7 +13137,7 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
tg3_init_bufmgr_config(tp);

if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0)
fw_name = FIRMWARE_TG3;
tp->fw_needed = FIRMWARE_TG3;

if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) {
tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE;
Expand All @@ -13104,37 +13150,10 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
tp->tg3_flags2 &= ~TG3_FLG2_TSO_CAPABLE;
} else {
tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE | TG3_FLG2_TSO_BUG;
}
if (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) {
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)
fw_name = FIRMWARE_TG3TSO5;
tp->fw_needed = FIRMWARE_TG3TSO5;
else
fw_name = FIRMWARE_TG3TSO;
}

if (fw_name) {
const __be32 *fw_data;

err = request_firmware(&tp->fw, fw_name, &tp->pdev->dev);
if (err) {
printk(KERN_ERR "tg3: Failed to load firmware \"%s\"\n",
fw_name);
goto err_out_iounmap;
}

fw_data = (void *)tp->fw->data;

/* Firmware blob starts with version numbers, followed by
start address and _full_ length including BSS sections
(which must be longer than the actual data, of course */

tp->fw_len = be32_to_cpu(fw_data[2]); /* includes bss */
if (tp->fw_len < (tp->fw->size - 12)) {
printk(KERN_ERR "tg3: bogus length %d in \"%s\"\n",
tp->fw_len, fw_name);
err = -EINVAL;
goto err_out_fw;
}
tp->fw_needed = FIRMWARE_TG3TSO;
}

/* TSO is on by default on chips that support hardware TSO.
Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/net/tg3.h
Original file line number Diff line number Diff line change
Expand Up @@ -2764,6 +2764,7 @@ struct tg3 {
struct ethtool_coalesce coal;

/* firmware info */
const char *fw_needed;
const struct firmware *fw;
u32 fw_len; /* includes BSS */
};
Expand Down

0 comments on commit a8ab9ab

Please sign in to comment.