Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

phylib: Support registering a bunch of drivers

If registering of one of them fails, all already registered drivers
of this module will be unregistered.

Use the new register/unregister functions in all drivers
registering more than one driver.

amd.c, realtek.c: Simplify: directly return registration result.

Tested with broadcom.c
All others compile-tested.

Signed-off-by: Christian Hohnstaedt <chohnstaedt@innominate.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Christian Hohnstaedt and committed by
David S. Miller
d5bf9071 567990cf

+159 -431
+1 -7
drivers/net/phy/amd.c
··· 77 77 78 78 static int __init am79c_init(void) 79 79 { 80 - int ret; 81 - 82 - ret = phy_driver_register(&am79c_driver); 83 - if (ret) 84 - return ret; 85 - 86 - return 0; 80 + return phy_driver_register(&am79c_driver); 87 81 } 88 82 89 83 static void __exit am79c_exit(void)
+9 -22
drivers/net/phy/bcm63xx.c
··· 71 71 return err; 72 72 } 73 73 74 - static struct phy_driver bcm63xx_1_driver = { 74 + static struct phy_driver bcm63xx_driver[] = { 75 + { 75 76 .phy_id = 0x00406000, 76 77 .phy_id_mask = 0xfffffc00, 77 78 .name = "Broadcom BCM63XX (1)", ··· 85 84 .ack_interrupt = bcm63xx_ack_interrupt, 86 85 .config_intr = bcm63xx_config_intr, 87 86 .driver = { .owner = THIS_MODULE }, 88 - }; 89 - 90 - /* same phy as above, with just a different OUI */ 91 - static struct phy_driver bcm63xx_2_driver = { 87 + }, { 88 + /* same phy as above, with just a different OUI */ 92 89 .phy_id = 0x002bdc00, 93 90 .phy_id_mask = 0xfffffc00, 94 91 .name = "Broadcom BCM63XX (2)", ··· 98 99 .ack_interrupt = bcm63xx_ack_interrupt, 99 100 .config_intr = bcm63xx_config_intr, 100 101 .driver = { .owner = THIS_MODULE }, 101 - }; 102 + } }; 102 103 103 104 static int __init bcm63xx_phy_init(void) 104 105 { 105 - int ret; 106 - 107 - ret = phy_driver_register(&bcm63xx_1_driver); 108 - if (ret) 109 - goto out_63xx_1; 110 - ret = phy_driver_register(&bcm63xx_2_driver); 111 - if (ret) 112 - goto out_63xx_2; 113 - return ret; 114 - 115 - out_63xx_2: 116 - phy_driver_unregister(&bcm63xx_1_driver); 117 - out_63xx_1: 118 - return ret; 106 + return phy_drivers_register(bcm63xx_driver, 107 + ARRAY_SIZE(bcm63xx_driver)); 119 108 } 120 109 121 110 static void __exit bcm63xx_phy_exit(void) 122 111 { 123 - phy_driver_unregister(&bcm63xx_1_driver); 124 - phy_driver_unregister(&bcm63xx_2_driver); 112 + phy_drivers_unregister(bcm63xx_driver, 113 + ARRAY_SIZE(bcm63xx_driver)); 125 114 } 126 115 127 116 module_init(bcm63xx_phy_init);
+8 -16
drivers/net/phy/bcm87xx.c
··· 187 187 return phydev->c45_ids.device_ids[4] == PHY_ID_BCM8727; 188 188 } 189 189 190 - static struct phy_driver bcm8706_driver = { 190 + static struct phy_driver bcm87xx_driver[] = { 191 + { 191 192 .phy_id = PHY_ID_BCM8706, 192 193 .phy_id_mask = 0xffffffff, 193 194 .name = "Broadcom BCM8706", ··· 201 200 .did_interrupt = bcm87xx_did_interrupt, 202 201 .match_phy_device = bcm8706_match_phy_device, 203 202 .driver = { .owner = THIS_MODULE }, 204 - }; 205 - 206 - static struct phy_driver bcm8727_driver = { 203 + }, { 207 204 .phy_id = PHY_ID_BCM8727, 208 205 .phy_id_mask = 0xffffffff, 209 206 .name = "Broadcom BCM8727", ··· 214 215 .did_interrupt = bcm87xx_did_interrupt, 215 216 .match_phy_device = bcm8727_match_phy_device, 216 217 .driver = { .owner = THIS_MODULE }, 217 - }; 218 + } }; 218 219 219 220 static int __init bcm87xx_init(void) 220 221 { 221 - int ret; 222 - 223 - ret = phy_driver_register(&bcm8706_driver); 224 - if (ret) 225 - goto err; 226 - 227 - ret = phy_driver_register(&bcm8727_driver); 228 - err: 229 - return ret; 222 + return phy_drivers_register(bcm87xx_driver, 223 + ARRAY_SIZE(bcm87xx_driver)); 230 224 } 231 225 module_init(bcm87xx_init); 232 226 233 227 static void __exit bcm87xx_exit(void) 234 228 { 235 - phy_driver_unregister(&bcm8706_driver); 236 - phy_driver_unregister(&bcm8727_driver); 229 + phy_drivers_unregister(bcm87xx_driver, 230 + ARRAY_SIZE(bcm87xx_driver)); 237 231 } 238 232 module_exit(bcm87xx_exit);
+17 -102
drivers/net/phy/broadcom.c
··· 682 682 return err; 683 683 } 684 684 685 - static struct phy_driver bcm5411_driver = { 685 + static struct phy_driver broadcom_drivers[] = { 686 + { 686 687 .phy_id = PHY_ID_BCM5411, 687 688 .phy_id_mask = 0xfffffff0, 688 689 .name = "Broadcom BCM5411", ··· 696 695 .ack_interrupt = bcm54xx_ack_interrupt, 697 696 .config_intr = bcm54xx_config_intr, 698 697 .driver = { .owner = THIS_MODULE }, 699 - }; 700 - 701 - static struct phy_driver bcm5421_driver = { 698 + }, { 702 699 .phy_id = PHY_ID_BCM5421, 703 700 .phy_id_mask = 0xfffffff0, 704 701 .name = "Broadcom BCM5421", ··· 709 710 .ack_interrupt = bcm54xx_ack_interrupt, 710 711 .config_intr = bcm54xx_config_intr, 711 712 .driver = { .owner = THIS_MODULE }, 712 - }; 713 - 714 - static struct phy_driver bcm5461_driver = { 713 + }, { 715 714 .phy_id = PHY_ID_BCM5461, 716 715 .phy_id_mask = 0xfffffff0, 717 716 .name = "Broadcom BCM5461", ··· 722 725 .ack_interrupt = bcm54xx_ack_interrupt, 723 726 .config_intr = bcm54xx_config_intr, 724 727 .driver = { .owner = THIS_MODULE }, 725 - }; 726 - 727 - static struct phy_driver bcm5464_driver = { 728 + }, { 728 729 .phy_id = PHY_ID_BCM5464, 729 730 .phy_id_mask = 0xfffffff0, 730 731 .name = "Broadcom BCM5464", ··· 735 740 .ack_interrupt = bcm54xx_ack_interrupt, 736 741 .config_intr = bcm54xx_config_intr, 737 742 .driver = { .owner = THIS_MODULE }, 738 - }; 739 - 740 - static struct phy_driver bcm5481_driver = { 743 + }, { 741 744 .phy_id = PHY_ID_BCM5481, 742 745 .phy_id_mask = 0xfffffff0, 743 746 .name = "Broadcom BCM5481", ··· 748 755 .ack_interrupt = bcm54xx_ack_interrupt, 749 756 .config_intr = bcm54xx_config_intr, 750 757 .driver = { .owner = THIS_MODULE }, 751 - }; 752 - 753 - static struct phy_driver bcm5482_driver = { 758 + }, { 754 759 .phy_id = PHY_ID_BCM5482, 755 760 .phy_id_mask = 0xfffffff0, 756 761 .name = "Broadcom BCM5482", ··· 761 770 .ack_interrupt = bcm54xx_ack_interrupt, 762 771 .config_intr = bcm54xx_config_intr, 763 772 .driver = { .owner = THIS_MODULE }, 764 - }; 765 - 766 - static struct phy_driver bcm50610_driver = { 773 + }, { 767 774 .phy_id = PHY_ID_BCM50610, 768 775 .phy_id_mask = 0xfffffff0, 769 776 .name = "Broadcom BCM50610", ··· 774 785 .ack_interrupt = bcm54xx_ack_interrupt, 775 786 .config_intr = bcm54xx_config_intr, 776 787 .driver = { .owner = THIS_MODULE }, 777 - }; 778 - 779 - static struct phy_driver bcm50610m_driver = { 788 + }, { 780 789 .phy_id = PHY_ID_BCM50610M, 781 790 .phy_id_mask = 0xfffffff0, 782 791 .name = "Broadcom BCM50610M", ··· 787 800 .ack_interrupt = bcm54xx_ack_interrupt, 788 801 .config_intr = bcm54xx_config_intr, 789 802 .driver = { .owner = THIS_MODULE }, 790 - }; 791 - 792 - static struct phy_driver bcm57780_driver = { 803 + }, { 793 804 .phy_id = PHY_ID_BCM57780, 794 805 .phy_id_mask = 0xfffffff0, 795 806 .name = "Broadcom BCM57780", ··· 800 815 .ack_interrupt = bcm54xx_ack_interrupt, 801 816 .config_intr = bcm54xx_config_intr, 802 817 .driver = { .owner = THIS_MODULE }, 803 - }; 804 - 805 - static struct phy_driver bcmac131_driver = { 818 + }, { 806 819 .phy_id = PHY_ID_BCMAC131, 807 820 .phy_id_mask = 0xfffffff0, 808 821 .name = "Broadcom BCMAC131", ··· 813 830 .ack_interrupt = brcm_fet_ack_interrupt, 814 831 .config_intr = brcm_fet_config_intr, 815 832 .driver = { .owner = THIS_MODULE }, 816 - }; 817 - 818 - static struct phy_driver bcm5241_driver = { 833 + }, { 819 834 .phy_id = PHY_ID_BCM5241, 820 835 .phy_id_mask = 0xfffffff0, 821 836 .name = "Broadcom BCM5241", ··· 826 845 .ack_interrupt = brcm_fet_ack_interrupt, 827 846 .config_intr = brcm_fet_config_intr, 828 847 .driver = { .owner = THIS_MODULE }, 829 - }; 848 + } }; 830 849 831 850 static int __init broadcom_init(void) 832 851 { 833 - int ret; 834 - 835 - ret = phy_driver_register(&bcm5411_driver); 836 - if (ret) 837 - goto out_5411; 838 - ret = phy_driver_register(&bcm5421_driver); 839 - if (ret) 840 - goto out_5421; 841 - ret = phy_driver_register(&bcm5461_driver); 842 - if (ret) 843 - goto out_5461; 844 - ret = phy_driver_register(&bcm5464_driver); 845 - if (ret) 846 - goto out_5464; 847 - ret = phy_driver_register(&bcm5481_driver); 848 - if (ret) 849 - goto out_5481; 850 - ret = phy_driver_register(&bcm5482_driver); 851 - if (ret) 852 - goto out_5482; 853 - ret = phy_driver_register(&bcm50610_driver); 854 - if (ret) 855 - goto out_50610; 856 - ret = phy_driver_register(&bcm50610m_driver); 857 - if (ret) 858 - goto out_50610m; 859 - ret = phy_driver_register(&bcm57780_driver); 860 - if (ret) 861 - goto out_57780; 862 - ret = phy_driver_register(&bcmac131_driver); 863 - if (ret) 864 - goto out_ac131; 865 - ret = phy_driver_register(&bcm5241_driver); 866 - if (ret) 867 - goto out_5241; 868 - return ret; 869 - 870 - out_5241: 871 - phy_driver_unregister(&bcmac131_driver); 872 - out_ac131: 873 - phy_driver_unregister(&bcm57780_driver); 874 - out_57780: 875 - phy_driver_unregister(&bcm50610m_driver); 876 - out_50610m: 877 - phy_driver_unregister(&bcm50610_driver); 878 - out_50610: 879 - phy_driver_unregister(&bcm5482_driver); 880 - out_5482: 881 - phy_driver_unregister(&bcm5481_driver); 882 - out_5481: 883 - phy_driver_unregister(&bcm5464_driver); 884 - out_5464: 885 - phy_driver_unregister(&bcm5461_driver); 886 - out_5461: 887 - phy_driver_unregister(&bcm5421_driver); 888 - out_5421: 889 - phy_driver_unregister(&bcm5411_driver); 890 - out_5411: 891 - return ret; 852 + return phy_drivers_register(broadcom_drivers, 853 + ARRAY_SIZE(broadcom_drivers)); 892 854 } 893 855 894 856 static void __exit broadcom_exit(void) 895 857 { 896 - phy_driver_unregister(&bcm5241_driver); 897 - phy_driver_unregister(&bcmac131_driver); 898 - phy_driver_unregister(&bcm57780_driver); 899 - phy_driver_unregister(&bcm50610m_driver); 900 - phy_driver_unregister(&bcm50610_driver); 901 - phy_driver_unregister(&bcm5482_driver); 902 - phy_driver_unregister(&bcm5481_driver); 903 - phy_driver_unregister(&bcm5464_driver); 904 - phy_driver_unregister(&bcm5461_driver); 905 - phy_driver_unregister(&bcm5421_driver); 906 - phy_driver_unregister(&bcm5411_driver); 858 + phy_drivers_unregister(broadcom_drivers, 859 + ARRAY_SIZE(broadcom_drivers)); 907 860 } 908 861 909 862 module_init(broadcom_init);
+10 -25
drivers/net/phy/cicada.c
··· 102 102 } 103 103 104 104 /* Cicada 8201, a.k.a Vitesse VSC8201 */ 105 - static struct phy_driver cis8201_driver = { 105 + static struct phy_driver cis820x_driver[] = { 106 + { 106 107 .phy_id = 0x000fc410, 107 108 .name = "Cicada Cis8201", 108 109 .phy_id_mask = 0x000ffff0, ··· 114 113 .read_status = &genphy_read_status, 115 114 .ack_interrupt = &cis820x_ack_interrupt, 116 115 .config_intr = &cis820x_config_intr, 117 - .driver = { .owner = THIS_MODULE,}, 118 - }; 119 - 120 - /* Cicada 8204 */ 121 - static struct phy_driver cis8204_driver = { 116 + .driver = { .owner = THIS_MODULE,}, 117 + }, { 122 118 .phy_id = 0x000fc440, 123 119 .name = "Cicada Cis8204", 124 120 .phy_id_mask = 0x000fffc0, ··· 126 128 .read_status = &genphy_read_status, 127 129 .ack_interrupt = &cis820x_ack_interrupt, 128 130 .config_intr = &cis820x_config_intr, 129 - .driver = { .owner = THIS_MODULE,}, 130 - }; 131 + .driver = { .owner = THIS_MODULE,}, 132 + } }; 131 133 132 134 static int __init cicada_init(void) 133 135 { 134 - int ret; 135 - 136 - ret = phy_driver_register(&cis8204_driver); 137 - if (ret) 138 - goto err1; 139 - 140 - ret = phy_driver_register(&cis8201_driver); 141 - if (ret) 142 - goto err2; 143 - return 0; 144 - 145 - err2: 146 - phy_driver_unregister(&cis8204_driver); 147 - err1: 148 - return ret; 136 + return phy_drivers_register(cis820x_driver, 137 + ARRAY_SIZE(cis820x_driver)); 149 138 } 150 139 151 140 static void __exit cicada_exit(void) 152 141 { 153 - phy_driver_unregister(&cis8204_driver); 154 - phy_driver_unregister(&cis8201_driver); 142 + phy_drivers_unregister(cis820x_driver, 143 + ARRAY_SIZE(cis820x_driver)); 155 144 } 156 145 157 146 module_init(cicada_init);
+9 -32
drivers/net/phy/davicom.c
··· 144 144 return (err < 0) ? err : 0; 145 145 } 146 146 147 - static struct phy_driver dm9161e_driver = { 147 + static struct phy_driver dm91xx_driver[] = { 148 + { 148 149 .phy_id = 0x0181b880, 149 150 .name = "Davicom DM9161E", 150 151 .phy_id_mask = 0x0ffffff0, ··· 154 153 .config_aneg = dm9161_config_aneg, 155 154 .read_status = genphy_read_status, 156 155 .driver = { .owner = THIS_MODULE,}, 157 - }; 158 - 159 - static struct phy_driver dm9161a_driver = { 156 + }, { 160 157 .phy_id = 0x0181b8a0, 161 158 .name = "Davicom DM9161A", 162 159 .phy_id_mask = 0x0ffffff0, ··· 163 164 .config_aneg = dm9161_config_aneg, 164 165 .read_status = genphy_read_status, 165 166 .driver = { .owner = THIS_MODULE,}, 166 - }; 167 - 168 - static struct phy_driver dm9131_driver = { 167 + }, { 169 168 .phy_id = 0x00181b80, 170 169 .name = "Davicom DM9131", 171 170 .phy_id_mask = 0x0ffffff0, ··· 174 177 .ack_interrupt = dm9161_ack_interrupt, 175 178 .config_intr = dm9161_config_intr, 176 179 .driver = { .owner = THIS_MODULE,}, 177 - }; 180 + } }; 178 181 179 182 static int __init davicom_init(void) 180 183 { 181 - int ret; 182 - 183 - ret = phy_driver_register(&dm9161e_driver); 184 - if (ret) 185 - goto err1; 186 - 187 - ret = phy_driver_register(&dm9161a_driver); 188 - if (ret) 189 - goto err2; 190 - 191 - ret = phy_driver_register(&dm9131_driver); 192 - if (ret) 193 - goto err3; 194 - return 0; 195 - 196 - err3: 197 - phy_driver_unregister(&dm9161a_driver); 198 - err2: 199 - phy_driver_unregister(&dm9161e_driver); 200 - err1: 201 - return ret; 184 + return phy_drivers_register(dm91xx_driver, 185 + ARRAY_SIZE(dm91xx_driver)); 202 186 } 203 187 204 188 static void __exit davicom_exit(void) 205 189 { 206 - phy_driver_unregister(&dm9161e_driver); 207 - phy_driver_unregister(&dm9161a_driver); 208 - phy_driver_unregister(&dm9131_driver); 190 + phy_drivers_unregister(dm91xx_driver, 191 + ARRAY_SIZE(dm91xx_driver)); 209 192 } 210 193 211 194 module_init(davicom_init);
+9 -22
drivers/net/phy/icplus.c
··· 202 202 return 0; 203 203 } 204 204 205 - static struct phy_driver ip175c_driver = { 205 + static struct phy_driver icplus_driver[] = { 206 + { 206 207 .phy_id = 0x02430d80, 207 208 .name = "ICPlus IP175C", 208 209 .phy_id_mask = 0x0ffffff0, ··· 214 213 .suspend = genphy_suspend, 215 214 .resume = genphy_resume, 216 215 .driver = { .owner = THIS_MODULE,}, 217 - }; 218 - 219 - static struct phy_driver ip1001_driver = { 216 + }, { 220 217 .phy_id = 0x02430d90, 221 218 .name = "ICPlus IP1001", 222 219 .phy_id_mask = 0x0ffffff0, ··· 226 227 .suspend = genphy_suspend, 227 228 .resume = genphy_resume, 228 229 .driver = { .owner = THIS_MODULE,}, 229 - }; 230 - 231 - static struct phy_driver ip101a_g_driver = { 230 + }, { 232 231 .phy_id = 0x02430c54, 233 232 .name = "ICPlus IP101A/G", 234 233 .phy_id_mask = 0x0ffffff0, ··· 240 243 .suspend = genphy_suspend, 241 244 .resume = genphy_resume, 242 245 .driver = { .owner = THIS_MODULE,}, 243 - }; 246 + } }; 244 247 245 248 static int __init icplus_init(void) 246 249 { 247 - int ret = 0; 248 - 249 - ret = phy_driver_register(&ip1001_driver); 250 - if (ret < 0) 251 - return -ENODEV; 252 - 253 - ret = phy_driver_register(&ip101a_g_driver); 254 - if (ret < 0) 255 - return -ENODEV; 256 - 257 - return phy_driver_register(&ip175c_driver); 250 + return phy_drivers_register(icplus_driver, 251 + ARRAY_SIZE(icplus_driver)); 258 252 } 259 253 260 254 static void __exit icplus_exit(void) 261 255 { 262 - phy_driver_unregister(&ip1001_driver); 263 - phy_driver_unregister(&ip101a_g_driver); 264 - phy_driver_unregister(&ip175c_driver); 256 + phy_drivers_unregister(icplus_driver, 257 + ARRAY_SIZE(icplus_driver)); 265 258 } 266 259 267 260 module_init(icplus_init);
+12 -35
drivers/net/phy/lxt.c
··· 149 149 return phydev->priv ? 0 : genphy_config_aneg(phydev); 150 150 } 151 151 152 - static struct phy_driver lxt970_driver = { 152 + static struct phy_driver lxt97x_driver[] = { 153 + { 153 154 .phy_id = 0x78100000, 154 155 .name = "LXT970", 155 156 .phy_id_mask = 0xfffffff0, ··· 161 160 .read_status = genphy_read_status, 162 161 .ack_interrupt = lxt970_ack_interrupt, 163 162 .config_intr = lxt970_config_intr, 164 - .driver = { .owner = THIS_MODULE,}, 165 - }; 166 - 167 - static struct phy_driver lxt971_driver = { 163 + .driver = { .owner = THIS_MODULE,}, 164 + }, { 168 165 .phy_id = 0x001378e0, 169 166 .name = "LXT971", 170 167 .phy_id_mask = 0xfffffff0, ··· 172 173 .read_status = genphy_read_status, 173 174 .ack_interrupt = lxt971_ack_interrupt, 174 175 .config_intr = lxt971_config_intr, 175 - .driver = { .owner = THIS_MODULE,}, 176 - }; 177 - 178 - static struct phy_driver lxt973_driver = { 176 + .driver = { .owner = THIS_MODULE,}, 177 + }, { 179 178 .phy_id = 0x00137a10, 180 179 .name = "LXT973", 181 180 .phy_id_mask = 0xfffffff0, ··· 182 185 .probe = lxt973_probe, 183 186 .config_aneg = lxt973_config_aneg, 184 187 .read_status = genphy_read_status, 185 - .driver = { .owner = THIS_MODULE,}, 186 - }; 188 + .driver = { .owner = THIS_MODULE,}, 189 + } }; 187 190 188 191 static int __init lxt_init(void) 189 192 { 190 - int ret; 191 - 192 - ret = phy_driver_register(&lxt970_driver); 193 - if (ret) 194 - goto err1; 195 - 196 - ret = phy_driver_register(&lxt971_driver); 197 - if (ret) 198 - goto err2; 199 - 200 - ret = phy_driver_register(&lxt973_driver); 201 - if (ret) 202 - goto err3; 203 - return 0; 204 - 205 - err3: 206 - phy_driver_unregister(&lxt971_driver); 207 - err2: 208 - phy_driver_unregister(&lxt970_driver); 209 - err1: 210 - return ret; 193 + return phy_drivers_register(lxt97x_driver, 194 + ARRAY_SIZE(lxt97x_driver)); 211 195 } 212 196 213 197 static void __exit lxt_exit(void) 214 198 { 215 - phy_driver_unregister(&lxt970_driver); 216 - phy_driver_unregister(&lxt971_driver); 217 - phy_driver_unregister(&lxt973_driver); 199 + phy_drivers_unregister(lxt97x_driver, 200 + ARRAY_SIZE(lxt97x_driver)); 218 201 } 219 202 220 203 module_init(lxt_init);
+4 -18
drivers/net/phy/marvell.c
··· 826 826 827 827 static int __init marvell_init(void) 828 828 { 829 - int ret; 830 - int i; 831 - 832 - for (i = 0; i < ARRAY_SIZE(marvell_drivers); i++) { 833 - ret = phy_driver_register(&marvell_drivers[i]); 834 - 835 - if (ret) { 836 - while (i-- > 0) 837 - phy_driver_unregister(&marvell_drivers[i]); 838 - return ret; 839 - } 840 - } 841 - 842 - return 0; 829 + return phy_drivers_register(marvell_drivers, 830 + ARRAY_SIZE(marvell_drivers)); 843 831 } 844 832 845 833 static void __exit marvell_exit(void) 846 834 { 847 - int i; 848 - 849 - for (i = 0; i < ARRAY_SIZE(marvell_drivers); i++) 850 - phy_driver_unregister(&marvell_drivers[i]); 835 + phy_drivers_unregister(marvell_drivers, 836 + ARRAY_SIZE(marvell_drivers)); 851 837 } 852 838 853 839 module_init(marvell_init);
+11 -51
drivers/net/phy/micrel.c
··· 114 114 return 0; 115 115 } 116 116 117 - static struct phy_driver ks8737_driver = { 117 + static struct phy_driver ksphy_driver[] = { 118 + { 118 119 .phy_id = PHY_ID_KS8737, 119 120 .phy_id_mask = 0x00fffff0, 120 121 .name = "Micrel KS8737", ··· 127 126 .ack_interrupt = kszphy_ack_interrupt, 128 127 .config_intr = ks8737_config_intr, 129 128 .driver = { .owner = THIS_MODULE,}, 130 - }; 131 - 132 - static struct phy_driver ks8041_driver = { 129 + }, { 133 130 .phy_id = PHY_ID_KS8041, 134 131 .phy_id_mask = 0x00fffff0, 135 132 .name = "Micrel KS8041", ··· 140 141 .ack_interrupt = kszphy_ack_interrupt, 141 142 .config_intr = kszphy_config_intr, 142 143 .driver = { .owner = THIS_MODULE,}, 143 - }; 144 - 145 - static struct phy_driver ks8051_driver = { 144 + }, { 146 145 .phy_id = PHY_ID_KS8051, 147 146 .phy_id_mask = 0x00fffff0, 148 147 .name = "Micrel KS8051", ··· 153 156 .ack_interrupt = kszphy_ack_interrupt, 154 157 .config_intr = kszphy_config_intr, 155 158 .driver = { .owner = THIS_MODULE,}, 156 - }; 157 - 158 - static struct phy_driver ks8001_driver = { 159 + }, { 159 160 .phy_id = PHY_ID_KS8001, 160 161 .name = "Micrel KS8001 or KS8721", 161 162 .phy_id_mask = 0x00ffffff, ··· 165 170 .ack_interrupt = kszphy_ack_interrupt, 166 171 .config_intr = kszphy_config_intr, 167 172 .driver = { .owner = THIS_MODULE,}, 168 - }; 169 - 170 - static struct phy_driver ksz9021_driver = { 173 + }, { 171 174 .phy_id = PHY_ID_KSZ9021, 172 175 .phy_id_mask = 0x000ffffe, 173 176 .name = "Micrel KSZ9021 Gigabit PHY", ··· 178 185 .ack_interrupt = kszphy_ack_interrupt, 179 186 .config_intr = ksz9021_config_intr, 180 187 .driver = { .owner = THIS_MODULE, }, 181 - }; 188 + } }; 182 189 183 190 static int __init ksphy_init(void) 184 191 { 185 - int ret; 186 - 187 - ret = phy_driver_register(&ks8001_driver); 188 - if (ret) 189 - goto err1; 190 - 191 - ret = phy_driver_register(&ksz9021_driver); 192 - if (ret) 193 - goto err2; 194 - 195 - ret = phy_driver_register(&ks8737_driver); 196 - if (ret) 197 - goto err3; 198 - ret = phy_driver_register(&ks8041_driver); 199 - if (ret) 200 - goto err4; 201 - ret = phy_driver_register(&ks8051_driver); 202 - if (ret) 203 - goto err5; 204 - 205 - return 0; 206 - 207 - err5: 208 - phy_driver_unregister(&ks8041_driver); 209 - err4: 210 - phy_driver_unregister(&ks8737_driver); 211 - err3: 212 - phy_driver_unregister(&ksz9021_driver); 213 - err2: 214 - phy_driver_unregister(&ks8001_driver); 215 - err1: 216 - return ret; 192 + return phy_drivers_register(ksphy_driver, 193 + ARRAY_SIZE(ksphy_driver)); 217 194 } 218 195 219 196 static void __exit ksphy_exit(void) 220 197 { 221 - phy_driver_unregister(&ks8001_driver); 222 - phy_driver_unregister(&ks8737_driver); 223 - phy_driver_unregister(&ksz9021_driver); 224 - phy_driver_unregister(&ks8041_driver); 225 - phy_driver_unregister(&ks8051_driver); 198 + phy_drivers_unregister(ksphy_driver, 199 + ARRAY_SIZE(ksphy_driver)); 226 200 } 227 201 228 202 module_init(ksphy_init);
+25
drivers/net/phy/phy_device.c
··· 1079 1079 } 1080 1080 EXPORT_SYMBOL(phy_driver_register); 1081 1081 1082 + int phy_drivers_register(struct phy_driver *new_driver, int n) 1083 + { 1084 + int i, ret = 0; 1085 + 1086 + for (i = 0; i < n; i++) { 1087 + ret = phy_driver_register(new_driver + i); 1088 + if (ret) { 1089 + while (i-- > 0) 1090 + phy_driver_unregister(new_driver + i); 1091 + break; 1092 + } 1093 + } 1094 + return ret; 1095 + } 1096 + EXPORT_SYMBOL(phy_drivers_register); 1097 + 1082 1098 void phy_driver_unregister(struct phy_driver *drv) 1083 1099 { 1084 1100 driver_unregister(&drv->driver); 1085 1101 } 1086 1102 EXPORT_SYMBOL(phy_driver_unregister); 1103 + 1104 + void phy_drivers_unregister(struct phy_driver *drv, int n) 1105 + { 1106 + int i; 1107 + for (i = 0; i < n; i++) { 1108 + phy_driver_unregister(drv + i); 1109 + } 1110 + } 1111 + EXPORT_SYMBOL(phy_drivers_unregister); 1087 1112 1088 1113 static struct phy_driver genphy_driver = { 1089 1114 .phy_id = 0xffffffff,
+1 -5
drivers/net/phy/realtek.c
··· 65 65 66 66 static int __init realtek_init(void) 67 67 { 68 - int ret; 69 - 70 - ret = phy_driver_register(&rtl821x_driver); 71 - 72 - return ret; 68 + return phy_driver_register(&rtl821x_driver); 73 69 } 74 70 75 71 static void __exit realtek_exit(void)
+11 -53
drivers/net/phy/smsc.c
··· 61 61 return smsc_phy_ack_interrupt(phydev); 62 62 } 63 63 64 - static struct phy_driver lan83c185_driver = { 64 + static struct phy_driver smsc_phy_driver[] = { 65 + { 65 66 .phy_id = 0x0007c0a0, /* OUI=0x00800f, Model#=0x0a */ 66 67 .phy_id_mask = 0xfffffff0, 67 68 .name = "SMSC LAN83C185", ··· 84 83 .resume = genphy_resume, 85 84 86 85 .driver = { .owner = THIS_MODULE, } 87 - }; 88 - 89 - static struct phy_driver lan8187_driver = { 86 + }, { 90 87 .phy_id = 0x0007c0b0, /* OUI=0x00800f, Model#=0x0b */ 91 88 .phy_id_mask = 0xfffffff0, 92 89 .name = "SMSC LAN8187", ··· 106 107 .resume = genphy_resume, 107 108 108 109 .driver = { .owner = THIS_MODULE, } 109 - }; 110 - 111 - static struct phy_driver lan8700_driver = { 110 + }, { 112 111 .phy_id = 0x0007c0c0, /* OUI=0x00800f, Model#=0x0c */ 113 112 .phy_id_mask = 0xfffffff0, 114 113 .name = "SMSC LAN8700", ··· 128 131 .resume = genphy_resume, 129 132 130 133 .driver = { .owner = THIS_MODULE, } 131 - }; 132 - 133 - static struct phy_driver lan911x_int_driver = { 134 + }, { 134 135 .phy_id = 0x0007c0d0, /* OUI=0x00800f, Model#=0x0d */ 135 136 .phy_id_mask = 0xfffffff0, 136 137 .name = "SMSC LAN911x Internal PHY", ··· 150 155 .resume = genphy_resume, 151 156 152 157 .driver = { .owner = THIS_MODULE, } 153 - }; 154 - 155 - static struct phy_driver lan8710_driver = { 158 + }, { 156 159 .phy_id = 0x0007c0f0, /* OUI=0x00800f, Model#=0x0f */ 157 160 .phy_id_mask = 0xfffffff0, 158 161 .name = "SMSC LAN8710/LAN8720", ··· 172 179 .resume = genphy_resume, 173 180 174 181 .driver = { .owner = THIS_MODULE, } 175 - }; 182 + } }; 176 183 177 184 static int __init smsc_init(void) 178 185 { 179 - int ret; 180 - 181 - ret = phy_driver_register (&lan83c185_driver); 182 - if (ret) 183 - goto err1; 184 - 185 - ret = phy_driver_register (&lan8187_driver); 186 - if (ret) 187 - goto err2; 188 - 189 - ret = phy_driver_register (&lan8700_driver); 190 - if (ret) 191 - goto err3; 192 - 193 - ret = phy_driver_register (&lan911x_int_driver); 194 - if (ret) 195 - goto err4; 196 - 197 - ret = phy_driver_register (&lan8710_driver); 198 - if (ret) 199 - goto err5; 200 - 201 - return 0; 202 - 203 - err5: 204 - phy_driver_unregister (&lan911x_int_driver); 205 - err4: 206 - phy_driver_unregister (&lan8700_driver); 207 - err3: 208 - phy_driver_unregister (&lan8187_driver); 209 - err2: 210 - phy_driver_unregister (&lan83c185_driver); 211 - err1: 212 - return ret; 186 + return phy_drivers_register(smsc_phy_driver, 187 + ARRAY_SIZE(smsc_phy_driver)); 213 188 } 214 189 215 190 static void __exit smsc_exit(void) 216 191 { 217 - phy_driver_unregister (&lan8710_driver); 218 - phy_driver_unregister (&lan911x_int_driver); 219 - phy_driver_unregister (&lan8700_driver); 220 - phy_driver_unregister (&lan8187_driver); 221 - phy_driver_unregister (&lan83c185_driver); 192 + return phy_drivers_unregister(smsc_phy_driver, 193 + ARRAY_SIZE(smsc_phy_driver)); 222 194 } 223 195 224 196 MODULE_DESCRIPTION("SMSC PHY driver");
+8 -13
drivers/net/phy/ste10Xp.c
··· 81 81 return 0; 82 82 } 83 83 84 - static struct phy_driver ste101p_pdriver = { 84 + static struct phy_driver ste10xp_pdriver[] = { 85 + { 85 86 .phy_id = STE101P_PHY_ID, 86 87 .phy_id_mask = 0xfffffff0, 87 88 .name = "STe101p", ··· 96 95 .suspend = genphy_suspend, 97 96 .resume = genphy_resume, 98 97 .driver = {.owner = THIS_MODULE,} 99 - }; 100 - 101 - static struct phy_driver ste100p_pdriver = { 98 + }, { 102 99 .phy_id = STE100P_PHY_ID, 103 100 .phy_id_mask = 0xffffffff, 104 101 .name = "STe100p", ··· 110 111 .suspend = genphy_suspend, 111 112 .resume = genphy_resume, 112 113 .driver = {.owner = THIS_MODULE,} 113 - }; 114 + } }; 114 115 115 116 static int __init ste10Xp_init(void) 116 117 { 117 - int retval; 118 - 119 - retval = phy_driver_register(&ste100p_pdriver); 120 - if (retval < 0) 121 - return retval; 122 - return phy_driver_register(&ste101p_pdriver); 118 + return phy_drivers_register(ste10xp_pdriver, 119 + ARRAY_SIZE(ste10xp_pdriver)); 123 120 } 124 121 125 122 static void __exit ste10Xp_exit(void) 126 123 { 127 - phy_driver_unregister(&ste100p_pdriver); 128 - phy_driver_unregister(&ste101p_pdriver); 124 + phy_drivers_unregister(ste10xp_pdriver, 125 + ARRAY_SIZE(ste10xp_pdriver)); 129 126 } 130 127 131 128 module_init(ste10Xp_init);
+22 -30
drivers/net/phy/vitesse.c
··· 138 138 return err; 139 139 } 140 140 141 - /* Vitesse 824x */ 142 - static struct phy_driver vsc8244_driver = { 143 - .phy_id = PHY_ID_VSC8244, 144 - .name = "Vitesse VSC8244", 145 - .phy_id_mask = 0x000fffc0, 146 - .features = PHY_GBIT_FEATURES, 147 - .flags = PHY_HAS_INTERRUPT, 148 - .config_init = &vsc824x_config_init, 149 - .config_aneg = &genphy_config_aneg, 150 - .read_status = &genphy_read_status, 151 - .ack_interrupt = &vsc824x_ack_interrupt, 152 - .config_intr = &vsc82xx_config_intr, 153 - .driver = { .owner = THIS_MODULE,}, 154 - }; 155 - 156 141 static int vsc8221_config_init(struct phy_device *phydev) 157 142 { 158 143 int err; ··· 150 165 Options are 802.3Z SerDes or SGMII */ 151 166 } 152 167 153 - /* Vitesse 8221 */ 154 - static struct phy_driver vsc8221_driver = { 168 + /* Vitesse 824x */ 169 + static struct phy_driver vsc82xx_driver[] = { 170 + { 171 + .phy_id = PHY_ID_VSC8244, 172 + .name = "Vitesse VSC8244", 173 + .phy_id_mask = 0x000fffc0, 174 + .features = PHY_GBIT_FEATURES, 175 + .flags = PHY_HAS_INTERRUPT, 176 + .config_init = &vsc824x_config_init, 177 + .config_aneg = &genphy_config_aneg, 178 + .read_status = &genphy_read_status, 179 + .ack_interrupt = &vsc824x_ack_interrupt, 180 + .config_intr = &vsc82xx_config_intr, 181 + .driver = { .owner = THIS_MODULE,}, 182 + }, { 183 + /* Vitesse 8221 */ 155 184 .phy_id = PHY_ID_VSC8221, 156 185 .phy_id_mask = 0x000ffff0, 157 186 .name = "Vitesse VSC8221", ··· 176 177 .read_status = &genphy_read_status, 177 178 .ack_interrupt = &vsc824x_ack_interrupt, 178 179 .config_intr = &vsc82xx_config_intr, 179 - .driver = { .owner = THIS_MODULE,}, 180 - }; 180 + .driver = { .owner = THIS_MODULE,}, 181 + } }; 181 182 182 183 static int __init vsc82xx_init(void) 183 184 { 184 - int err; 185 - 186 - err = phy_driver_register(&vsc8244_driver); 187 - if (err < 0) 188 - return err; 189 - err = phy_driver_register(&vsc8221_driver); 190 - if (err < 0) 191 - phy_driver_unregister(&vsc8244_driver); 192 - return err; 185 + return phy_drivers_register(vsc82xx_driver, 186 + ARRAY_SIZE(vsc82xx_driver)); 193 187 } 194 188 195 189 static void __exit vsc82xx_exit(void) 196 190 { 197 - phy_driver_unregister(&vsc8244_driver); 198 - phy_driver_unregister(&vsc8221_driver); 191 + return phy_drivers_unregister(vsc82xx_driver, 192 + ARRAY_SIZE(vsc82xx_driver)); 199 193 } 200 194 201 195 module_init(vsc82xx_init);
+2
include/linux/phy.h
··· 533 533 int genphy_suspend(struct phy_device *phydev); 534 534 int genphy_resume(struct phy_device *phydev); 535 535 void phy_driver_unregister(struct phy_driver *drv); 536 + void phy_drivers_unregister(struct phy_driver *drv, int n); 536 537 int phy_driver_register(struct phy_driver *new_driver); 538 + int phy_drivers_register(struct phy_driver *new_driver, int n); 537 539 void phy_state_machine(struct work_struct *work); 538 540 void phy_start_machine(struct phy_device *phydev, 539 541 void (*handler)(struct net_device *));