aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/tg3.c94
1 files changed, 46 insertions, 48 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c
index 3725ac857086..37a462986db2 100644
--- a/drivers/net/tg3.c
+++ b/drivers/net/tg3.c
@@ -7865,6 +7865,33 @@ static int tg3_request_firmware(struct tg3 *tp)
7865 return 0; 7865 return 0;
7866} 7866}
7867 7867
7868static void tg3_ints_init(struct tg3 *tp)
7869{
7870 if (tp->tg3_flags & TG3_FLAG_SUPPORT_MSI) {
7871 /* All MSI supporting chips should support tagged
7872 * status. Assert that this is the case.
7873 */
7874 if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)) {
7875 printk(KERN_WARNING PFX "%s: MSI without TAGGED? "
7876 "Not using MSI.\n", tp->dev->name);
7877 } else if (pci_enable_msi(tp->pdev) == 0) {
7878 u32 msi_mode;
7879
7880 msi_mode = tr32(MSGINT_MODE);
7881 tw32(MSGINT_MODE, msi_mode | MSGINT_MODE_ENABLE);
7882 tp->tg3_flags2 |= TG3_FLG2_USING_MSI;
7883 }
7884 }
7885}
7886
7887static void tg3_ints_fini(struct tg3 *tp)
7888{
7889 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
7890 pci_disable_msi(tp->pdev);
7891 tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI;
7892 }
7893}
7894
7868static int tg3_open(struct net_device *dev) 7895static int tg3_open(struct net_device *dev)
7869{ 7896{
7870 struct tg3 *tp = netdev_priv(dev); 7897 struct tg3 *tp = netdev_priv(dev);
@@ -7906,33 +7933,14 @@ static int tg3_open(struct net_device *dev)
7906 if (err) 7933 if (err)
7907 return err; 7934 return err;
7908 7935
7909 if (tp->tg3_flags & TG3_FLAG_SUPPORT_MSI) { 7936 tg3_ints_init(tp);
7910 /* All MSI supporting chips should support tagged
7911 * status. Assert that this is the case.
7912 */
7913 if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)) {
7914 printk(KERN_WARNING PFX "%s: MSI without TAGGED? "
7915 "Not using MSI.\n", tp->dev->name);
7916 } else if (pci_enable_msi(tp->pdev) == 0) {
7917 u32 msi_mode;
7918 7937
7919 msi_mode = tr32(MSGINT_MODE); 7938 napi_enable(&tp->napi);
7920 tw32(MSGINT_MODE, msi_mode | MSGINT_MODE_ENABLE);
7921 tp->tg3_flags2 |= TG3_FLG2_USING_MSI;
7922 }
7923 }
7924 err = tg3_request_irq(tp);
7925 7939
7926 if (err) { 7940 err = tg3_request_irq(tp);
7927 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
7928 pci_disable_msi(tp->pdev);
7929 tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI;
7930 }
7931 tg3_free_consistent(tp);
7932 return err;
7933 }
7934 7941
7935 napi_enable(&tp->napi); 7942 if (err)
7943 goto err_out1;
7936 7944
7937 tg3_full_lock(tp, 0); 7945 tg3_full_lock(tp, 0);
7938 7946
@@ -7960,36 +7968,19 @@ static int tg3_open(struct net_device *dev)
7960 7968
7961 tg3_full_unlock(tp); 7969 tg3_full_unlock(tp);
7962 7970
7963 if (err) { 7971 if (err)
7964 napi_disable(&tp->napi); 7972 goto err_out2;
7965 free_irq(tp->pdev->irq, dev);
7966 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
7967 pci_disable_msi(tp->pdev);
7968 tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI;
7969 }
7970 tg3_free_consistent(tp);
7971 return err;
7972 }
7973 7973
7974 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { 7974 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
7975 err = tg3_test_msi(tp); 7975 err = tg3_test_msi(tp);
7976 7976
7977 if (err) { 7977 if (err) {
7978 tg3_full_lock(tp, 0); 7978 tg3_full_lock(tp, 0);
7979
7980 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
7981 pci_disable_msi(tp->pdev);
7982 tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI;
7983 }
7984 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); 7979 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
7985 tg3_free_rings(tp); 7980 tg3_free_rings(tp);
7986 tg3_free_consistent(tp);
7987
7988 tg3_full_unlock(tp); 7981 tg3_full_unlock(tp);
7989 7982
7990 napi_disable(&tp->napi); 7983 goto err_out1;
7991
7992 return err;
7993 } 7984 }
7994 7985
7995 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { 7986 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
@@ -8015,6 +8006,15 @@ static int tg3_open(struct net_device *dev)
8015 netif_start_queue(dev); 8006 netif_start_queue(dev);
8016 8007
8017 return 0; 8008 return 0;
8009
8010err_out2:
8011 free_irq(tp->pdev->irq, dev);
8012
8013err_out1:
8014 napi_disable(&tp->napi);
8015 tg3_ints_fini(tp);
8016 tg3_free_consistent(tp);
8017 return err;
8018} 8018}
8019 8019
8020#if 0 8020#if 0
@@ -8273,10 +8273,8 @@ static int tg3_close(struct net_device *dev)
8273 tg3_full_unlock(tp); 8273 tg3_full_unlock(tp);
8274 8274
8275 free_irq(tp->pdev->irq, dev); 8275 free_irq(tp->pdev->irq, dev);
8276 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { 8276
8277 pci_disable_msi(tp->pdev); 8277 tg3_ints_fini(tp);
8278 tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI;
8279 }
8280 8278
8281 memcpy(&tp->net_stats_prev, tg3_get_stats(tp->dev), 8279 memcpy(&tp->net_stats_prev, tg3_get_stats(tp->dev),
8282 sizeof(tp->net_stats_prev)); 8280 sizeof(tp->net_stats_prev));