From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759501AbcHYP61 (ORCPT ); Thu, 25 Aug 2016 11:58:27 -0400 Received: from mout.kundenserver.de ([212.227.126.187]:65469 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756386AbcHYP6M (ORCPT ); Thu, 25 Aug 2016 11:58:12 -0400 From: Arnd Bergmann To: linux-arm-kernel@lists.infradead.org Cc: Russell King , Yoshinori Sato , Nicolas Pitre , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Robert Jarzmik , "David S. Miller" Subject: [PATCH v2 1/2] smc91x: always use 8-bit access if necessary Date: Thu, 25 Aug 2016 17:39:00 +0200 Message-ID: <3107598.uul2xx8LJA@wuerfel> User-Agent: KMail/5.1.3 (Linux/4.4.0-31-generic; KDE/5.18.0; x86_64; ; ) In-Reply-To: <20160825144633.1850889-1-arnd@arndb.de> References: <20160825144633.1850889-1-arnd@arndb.de> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Provags-ID: V03:K0:2AiXhKLRyI3jNJpVStG85giYhN6L9gVqFWsmNqxnXLMZY1Ctg9C rxz1kawm4JrpqfUBYGM3dUvD120Mnm2E3Q2w85cByIjzBTVnr2tdTH88tJ2PyUPIefNoCV4 uUG83FpCoq636oHX3Kyelyzb5ZP0fnZJrMfcBz/5r03OKaP2ceIwo2FwqruDNYC3EGq0BvL SjS9byLbbM5aCDWN3D7cw== X-UI-Out-Filterresults: notjunk:1;V01:K0:hGjMZ038p7w=:tSVEB/2UA2UgSHiDPYYjNU 0G4dkF9eysY6bkWfVTWXcu9GCOmxzSKVivCDNRnAa4Okn0Gva/JjpMkfEVBUK16Xet3CIGbsm +SyIshDwAbTmWa0S63STjHqF0ZV7hGJPlZzdlYJWOsCnqf/a08Zz3gsTD5cJHOAlL6CevUQL0 4b9nB1RlFzGa8Sd12ZQee/5RvLMQ+xI2UzTbaTWpHbouFY2RSD1Id9ijYhNPebqhRlVDDXlVU T8hKK+uWX0DwZz6TpUvhpsZG41X3igBEeQLLXfCdz4bHfwFtbpKfJJ53mKxe19xcbPXiIVBYj z4U+r563ZXqr0fN8CvgUfUZvEP8HN6+bNTnr8AjVWHg2AJIgnOaEro8FltEwNvpel5nDQO/JL K6gNyHwm94YcCOEkZilE6nRWt2/7uAuNdQWXMvv8/3/9GiaQ6ATXtrD6OqL4R54c6S3DRZgZG sE0jlR3au2UaQrLaRZEaOHrkjXCLBlmSHtY4ZvcUP+ltINa7jtNKgv9/VdfB9I2dAuqZk0fF4 Lntl98NppQPFl5kI/bvQfIwsvmNk0CI5TFyqjOgcLlTkzOQq7BOyWFfm7e5NcSHBs2RjgpJMc mul9x+p1biezS1rVJ/Zu4Ux8TIYvHkmJx9M7ZhfqrScRzk/HHrjuI0QZAaOiGne/k4njy1HNm bHiNWMWgIDXMOVRZD+4Mvdjb3P+F1rbZf0AR2HYWJilovXvDYwY6MPi75uzLrd7E0ks+/89sC 3sS/T9s9UIaxTLNP Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org As Russell King found out the hard way, a change I did to fix multiplatform builds with this driver broke the old Assabet/Neponset platform: It turns out that while the driver is runtime configurable in principle, the runtime configuration does not cover the specific case of machines that can not do any 16-bit I/O on the smc91x registers. The driver currently provides helpers to access 16-bit registers for architectures that are known at compile-time to only have 8-bit I/O, but my patch changed it to a runtime flag that never gets consulted most register accesses. This introduces new SMC_out16()/SMC_in16 helpers (if anyone can suggest a better name, I'm glad to modify this) that behaves like SMC_outw()/SMC_inw() most of the time, but uses a pair of 8-bit accesses on platforms that have no support for wider register accesses. Signed-off-by: Arnd Bergmann Reported-by: Russell King Fixes: b70661c70830d ("net: smc91x: use run-time configuration on all ARM machines") --- Having bad luck streak with this patch, the version I sent had a couple of mistakes from the last rebase before sending it out, this version should actually apply and build. diff --git a/drivers/net/ethernet/smsc/smc91x.h b/drivers/net/ethernet/smsc/smc91x.h index 1a55c7976df0..497411ed6de2 100644 --- a/drivers/net/ethernet/smsc/smc91x.h +++ b/drivers/net/ethernet/smsc/smc91x.h @@ -414,30 +414,32 @@ smc_pxa_dma_insw(void __iomem *ioaddr, struct smc_local *lp, int reg, int dma, #define SMC_outsl(a, r, p, l) BUG() #endif -#if ! SMC_CAN_USE_16BIT - /* - * Any 16-bit access is performed with two 8-bit accesses if the hardware - * can't do it directly. Most registers are 16-bit so those are mandatory. + * Any 16-bit register access is performed with two 8-bit accesses if the + * hardware can't do it directly. */ -#define SMC_outw(x, ioaddr, reg) \ - do { \ - unsigned int __val16 = (x); \ - SMC_outb( __val16, ioaddr, reg ); \ - SMC_outb( __val16 >> 8, ioaddr, reg + (1 << SMC_IO_SHIFT));\ - } while (0) -#define SMC_inw(ioaddr, reg) \ - ({ \ - unsigned int __val16; \ - __val16 = SMC_inb( ioaddr, reg ); \ +#define SMC_out16(x, ioaddr, reg) \ +do { \ + if (SMC_CAN_USE_8BIT && !SMC_16BIT(lp)) { \ + unsigned int __val16 = (x); \ + SMC_outb(__val16, ioaddr, reg ); \ + SMC_outb(__val16 >> 8, ioaddr, reg + (1 << SMC_IO_SHIFT)); \ + } else { \ + SMC_outw(x, ioaddr, reg); \ + } \ +} while (0) + +#define SMC_in16(ioaddr, reg) \ +({ \ + unsigned int __val16; \ + if (SMC_CAN_USE_8BIT && !SMC_16BIT(lp)) { \ + __val16 = SMC_inb( ioaddr, reg ); \ __val16 |= SMC_inb( ioaddr, reg + (1 << SMC_IO_SHIFT)) << 8; \ - __val16; \ - }) - -#define SMC_insw(a, r, p, l) BUG() -#define SMC_outsw(a, r, p, l) BUG() - -#endif + } else { \ + __val16 = SMC_inw(ioaddr, reg); \ + } \ + __val16; \ +}) #if !defined(SMC_insw) || !defined(SMC_outsw) #define SMC_insw(a, r, p, l) BUG() @@ -927,113 +929,113 @@ static const char * chip_ids[ 16 ] = { SMC_outw((x) << 8, ioaddr, INT_REG(lp)); \ } while (0) -#define SMC_CURRENT_BANK(lp) SMC_inw(ioaddr, BANK_SELECT) +#define SMC_CURRENT_BANK(lp) SMC_in16(ioaddr, BANK_SELECT) #define SMC_SELECT_BANK(lp, x) \ do { \ if (SMC_MUST_ALIGN_WRITE(lp)) \ SMC_outl((x)<<16, ioaddr, 12<> 8; \ - __v = SMC_inw(ioaddr, ADDR1_REG(lp)); \ + __v = SMC_in16(ioaddr, ADDR1_REG(lp)); \ addr[2] = __v; addr[3] = __v >> 8; \ - __v = SMC_inw(ioaddr, ADDR2_REG(lp)); \ + __v = SMC_in16(ioaddr, ADDR2_REG(lp)); \ addr[4] = __v; addr[5] = __v >> 8; \ } while (0) #endif #define SMC_SET_MAC_ADDR(lp, addr) \ do { \ - SMC_outw(addr[0]|(addr[1] << 8), ioaddr, ADDR0_REG(lp)); \ - SMC_outw(addr[2]|(addr[3] << 8), ioaddr, ADDR1_REG(lp)); \ - SMC_outw(addr[4]|(addr[5] << 8), ioaddr, ADDR2_REG(lp)); \ + SMC_out16(addr[0]|(addr[1] << 8), ioaddr, ADDR0_REG(lp)); \ + SMC_out16(addr[2]|(addr[3] << 8), ioaddr, ADDR1_REG(lp)); \ + SMC_out16(addr[4]|(addr[5] << 8), ioaddr, ADDR2_REG(lp)); \ } while (0) #define SMC_SET_MCAST(lp, x) \ do { \ const unsigned char *mt = (x); \ - SMC_outw(mt[0] | (mt[1] << 8), ioaddr, MCAST_REG1(lp)); \ - SMC_outw(mt[2] | (mt[3] << 8), ioaddr, MCAST_REG2(lp)); \ - SMC_outw(mt[4] | (mt[5] << 8), ioaddr, MCAST_REG3(lp)); \ - SMC_outw(mt[6] | (mt[7] << 8), ioaddr, MCAST_REG4(lp)); \ + SMC_out16(mt[0] | (mt[1] << 8), ioaddr, MCAST_REG1(lp)); \ + SMC_out16(mt[2] | (mt[3] << 8), ioaddr, MCAST_REG2(lp)); \ + SMC_out16(mt[4] | (mt[5] << 8), ioaddr, MCAST_REG3(lp)); \ + SMC_out16(mt[6] | (mt[7] << 8), ioaddr, MCAST_REG4(lp)); \ } while (0) #define SMC_PUT_PKT_HDR(lp, status, length) \ @@ -1042,8 +1044,8 @@ static const char * chip_ids[ 16 ] = { SMC_outl((status) | (length)<<16, ioaddr, \ DATA_REG(lp)); \ else { \ - SMC_outw(status, ioaddr, DATA_REG(lp)); \ - SMC_outw(length, ioaddr, DATA_REG(lp)); \ + SMC_out16(status, ioaddr, DATA_REG(lp)); \ + SMC_out16(length, ioaddr, DATA_REG(lp)); \ } \ } while (0) @@ -1054,8 +1056,8 @@ static const char * chip_ids[ 16 ] = { (status) = __val & 0xffff; \ (length) = __val >> 16; \ } else { \ - (status) = SMC_inw(ioaddr, DATA_REG(lp)); \ - (length) = SMC_inw(ioaddr, DATA_REG(lp)); \ + (status) = SMC_in16(ioaddr, DATA_REG(lp)); \ + (length) = SMC_in16(ioaddr, DATA_REG(lp)); \ } \ } while (0) From mboxrd@z Thu Jan 1 00:00:00 1970 From: Arnd Bergmann Subject: [PATCH v2 1/2] smc91x: always use 8-bit access if necessary Date: Thu, 25 Aug 2016 17:39:00 +0200 Message-ID: <3107598.uul2xx8LJA@wuerfel> References: <20160825144633.1850889-1-arnd@arndb.de> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Cc: Yoshinori Sato , Nicolas Pitre , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Russell King , Robert Jarzmik , "David S. Miller" To: linux-arm-kernel@lists.infradead.org Return-path: In-Reply-To: <20160825144633.1850889-1-arnd@arndb.de> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=m.gmane.org@lists.infradead.org List-Id: netdev.vger.kernel.org As Russell King found out the hard way, a change I did to fix multiplatform builds with this driver broke the old Assabet/Neponset platform: It turns out that while the driver is runtime configurable in principle, the runtime configuration does not cover the specific case of machines that can not do any 16-bit I/O on the smc91x registers. The driver currently provides helpers to access 16-bit registers for architectures that are known at compile-time to only have 8-bit I/O, but my patch changed it to a runtime flag that never gets consulted most register accesses. This introduces new SMC_out16()/SMC_in16 helpers (if anyone can suggest a better name, I'm glad to modify this) that behaves like SMC_outw()/SMC_inw() most of the time, but uses a pair of 8-bit accesses on platforms that have no support for wider register accesses. Signed-off-by: Arnd Bergmann Reported-by: Russell King Fixes: b70661c70830d ("net: smc91x: use run-time configuration on all ARM machines") --- Having bad luck streak with this patch, the version I sent had a couple of mistakes from the last rebase before sending it out, this version should actually apply and build. diff --git a/drivers/net/ethernet/smsc/smc91x.h b/drivers/net/ethernet/smsc/smc91x.h index 1a55c7976df0..497411ed6de2 100644 --- a/drivers/net/ethernet/smsc/smc91x.h +++ b/drivers/net/ethernet/smsc/smc91x.h @@ -414,30 +414,32 @@ smc_pxa_dma_insw(void __iomem *ioaddr, struct smc_local *lp, int reg, int dma, #define SMC_outsl(a, r, p, l) BUG() #endif -#if ! SMC_CAN_USE_16BIT - /* - * Any 16-bit access is performed with two 8-bit accesses if the hardware - * can't do it directly. Most registers are 16-bit so those are mandatory. + * Any 16-bit register access is performed with two 8-bit accesses if the + * hardware can't do it directly. */ -#define SMC_outw(x, ioaddr, reg) \ - do { \ - unsigned int __val16 = (x); \ - SMC_outb( __val16, ioaddr, reg ); \ - SMC_outb( __val16 >> 8, ioaddr, reg + (1 << SMC_IO_SHIFT));\ - } while (0) -#define SMC_inw(ioaddr, reg) \ - ({ \ - unsigned int __val16; \ - __val16 = SMC_inb( ioaddr, reg ); \ +#define SMC_out16(x, ioaddr, reg) \ +do { \ + if (SMC_CAN_USE_8BIT && !SMC_16BIT(lp)) { \ + unsigned int __val16 = (x); \ + SMC_outb(__val16, ioaddr, reg ); \ + SMC_outb(__val16 >> 8, ioaddr, reg + (1 << SMC_IO_SHIFT)); \ + } else { \ + SMC_outw(x, ioaddr, reg); \ + } \ +} while (0) + +#define SMC_in16(ioaddr, reg) \ +({ \ + unsigned int __val16; \ + if (SMC_CAN_USE_8BIT && !SMC_16BIT(lp)) { \ + __val16 = SMC_inb( ioaddr, reg ); \ __val16 |= SMC_inb( ioaddr, reg + (1 << SMC_IO_SHIFT)) << 8; \ - __val16; \ - }) - -#define SMC_insw(a, r, p, l) BUG() -#define SMC_outsw(a, r, p, l) BUG() - -#endif + } else { \ + __val16 = SMC_inw(ioaddr, reg); \ + } \ + __val16; \ +}) #if !defined(SMC_insw) || !defined(SMC_outsw) #define SMC_insw(a, r, p, l) BUG() @@ -927,113 +929,113 @@ static const char * chip_ids[ 16 ] = { SMC_outw((x) << 8, ioaddr, INT_REG(lp)); \ } while (0) -#define SMC_CURRENT_BANK(lp) SMC_inw(ioaddr, BANK_SELECT) +#define SMC_CURRENT_BANK(lp) SMC_in16(ioaddr, BANK_SELECT) #define SMC_SELECT_BANK(lp, x) \ do { \ if (SMC_MUST_ALIGN_WRITE(lp)) \ SMC_outl((x)<<16, ioaddr, 12<> 8; \ - __v = SMC_inw(ioaddr, ADDR1_REG(lp)); \ + __v = SMC_in16(ioaddr, ADDR1_REG(lp)); \ addr[2] = __v; addr[3] = __v >> 8; \ - __v = SMC_inw(ioaddr, ADDR2_REG(lp)); \ + __v = SMC_in16(ioaddr, ADDR2_REG(lp)); \ addr[4] = __v; addr[5] = __v >> 8; \ } while (0) #endif #define SMC_SET_MAC_ADDR(lp, addr) \ do { \ - SMC_outw(addr[0]|(addr[1] << 8), ioaddr, ADDR0_REG(lp)); \ - SMC_outw(addr[2]|(addr[3] << 8), ioaddr, ADDR1_REG(lp)); \ - SMC_outw(addr[4]|(addr[5] << 8), ioaddr, ADDR2_REG(lp)); \ + SMC_out16(addr[0]|(addr[1] << 8), ioaddr, ADDR0_REG(lp)); \ + SMC_out16(addr[2]|(addr[3] << 8), ioaddr, ADDR1_REG(lp)); \ + SMC_out16(addr[4]|(addr[5] << 8), ioaddr, ADDR2_REG(lp)); \ } while (0) #define SMC_SET_MCAST(lp, x) \ do { \ const unsigned char *mt = (x); \ - SMC_outw(mt[0] | (mt[1] << 8), ioaddr, MCAST_REG1(lp)); \ - SMC_outw(mt[2] | (mt[3] << 8), ioaddr, MCAST_REG2(lp)); \ - SMC_outw(mt[4] | (mt[5] << 8), ioaddr, MCAST_REG3(lp)); \ - SMC_outw(mt[6] | (mt[7] << 8), ioaddr, MCAST_REG4(lp)); \ + SMC_out16(mt[0] | (mt[1] << 8), ioaddr, MCAST_REG1(lp)); \ + SMC_out16(mt[2] | (mt[3] << 8), ioaddr, MCAST_REG2(lp)); \ + SMC_out16(mt[4] | (mt[5] << 8), ioaddr, MCAST_REG3(lp)); \ + SMC_out16(mt[6] | (mt[7] << 8), ioaddr, MCAST_REG4(lp)); \ } while (0) #define SMC_PUT_PKT_HDR(lp, status, length) \ @@ -1042,8 +1044,8 @@ static const char * chip_ids[ 16 ] = { SMC_outl((status) | (length)<<16, ioaddr, \ DATA_REG(lp)); \ else { \ - SMC_outw(status, ioaddr, DATA_REG(lp)); \ - SMC_outw(length, ioaddr, DATA_REG(lp)); \ + SMC_out16(status, ioaddr, DATA_REG(lp)); \ + SMC_out16(length, ioaddr, DATA_REG(lp)); \ } \ } while (0) @@ -1054,8 +1056,8 @@ static const char * chip_ids[ 16 ] = { (status) = __val & 0xffff; \ (length) = __val >> 16; \ } else { \ - (status) = SMC_inw(ioaddr, DATA_REG(lp)); \ - (length) = SMC_inw(ioaddr, DATA_REG(lp)); \ + (status) = SMC_in16(ioaddr, DATA_REG(lp)); \ + (length) = SMC_in16(ioaddr, DATA_REG(lp)); \ } \ } while (0) From mboxrd@z Thu Jan 1 00:00:00 1970 From: arnd@arndb.de (Arnd Bergmann) Date: Thu, 25 Aug 2016 17:39:00 +0200 Subject: [PATCH v2 1/2] smc91x: always use 8-bit access if necessary In-Reply-To: <20160825144633.1850889-1-arnd@arndb.de> References: <20160825144633.1850889-1-arnd@arndb.de> Message-ID: <3107598.uul2xx8LJA@wuerfel> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org As Russell King found out the hard way, a change I did to fix multiplatform builds with this driver broke the old Assabet/Neponset platform: It turns out that while the driver is runtime configurable in principle, the runtime configuration does not cover the specific case of machines that can not do any 16-bit I/O on the smc91x registers. The driver currently provides helpers to access 16-bit registers for architectures that are known at compile-time to only have 8-bit I/O, but my patch changed it to a runtime flag that never gets consulted most register accesses. This introduces new SMC_out16()/SMC_in16 helpers (if anyone can suggest a better name, I'm glad to modify this) that behaves like SMC_outw()/SMC_inw() most of the time, but uses a pair of 8-bit accesses on platforms that have no support for wider register accesses. Signed-off-by: Arnd Bergmann Reported-by: Russell King Fixes: b70661c70830d ("net: smc91x: use run-time configuration on all ARM machines") --- Having bad luck streak with this patch, the version I sent had a couple of mistakes from the last rebase before sending it out, this version should actually apply and build. diff --git a/drivers/net/ethernet/smsc/smc91x.h b/drivers/net/ethernet/smsc/smc91x.h index 1a55c7976df0..497411ed6de2 100644 --- a/drivers/net/ethernet/smsc/smc91x.h +++ b/drivers/net/ethernet/smsc/smc91x.h @@ -414,30 +414,32 @@ smc_pxa_dma_insw(void __iomem *ioaddr, struct smc_local *lp, int reg, int dma, #define SMC_outsl(a, r, p, l) BUG() #endif -#if ! SMC_CAN_USE_16BIT - /* - * Any 16-bit access is performed with two 8-bit accesses if the hardware - * can't do it directly. Most registers are 16-bit so those are mandatory. + * Any 16-bit register access is performed with two 8-bit accesses if the + * hardware can't do it directly. */ -#define SMC_outw(x, ioaddr, reg) \ - do { \ - unsigned int __val16 = (x); \ - SMC_outb( __val16, ioaddr, reg ); \ - SMC_outb( __val16 >> 8, ioaddr, reg + (1 << SMC_IO_SHIFT));\ - } while (0) -#define SMC_inw(ioaddr, reg) \ - ({ \ - unsigned int __val16; \ - __val16 = SMC_inb( ioaddr, reg ); \ +#define SMC_out16(x, ioaddr, reg) \ +do { \ + if (SMC_CAN_USE_8BIT && !SMC_16BIT(lp)) { \ + unsigned int __val16 = (x); \ + SMC_outb(__val16, ioaddr, reg ); \ + SMC_outb(__val16 >> 8, ioaddr, reg + (1 << SMC_IO_SHIFT)); \ + } else { \ + SMC_outw(x, ioaddr, reg); \ + } \ +} while (0) + +#define SMC_in16(ioaddr, reg) \ +({ \ + unsigned int __val16; \ + if (SMC_CAN_USE_8BIT && !SMC_16BIT(lp)) { \ + __val16 = SMC_inb( ioaddr, reg ); \ __val16 |= SMC_inb( ioaddr, reg + (1 << SMC_IO_SHIFT)) << 8; \ - __val16; \ - }) - -#define SMC_insw(a, r, p, l) BUG() -#define SMC_outsw(a, r, p, l) BUG() - -#endif + } else { \ + __val16 = SMC_inw(ioaddr, reg); \ + } \ + __val16; \ +}) #if !defined(SMC_insw) || !defined(SMC_outsw) #define SMC_insw(a, r, p, l) BUG() @@ -927,113 +929,113 @@ static const char * chip_ids[ 16 ] = { SMC_outw((x) << 8, ioaddr, INT_REG(lp)); \ } while (0) -#define SMC_CURRENT_BANK(lp) SMC_inw(ioaddr, BANK_SELECT) +#define SMC_CURRENT_BANK(lp) SMC_in16(ioaddr, BANK_SELECT) #define SMC_SELECT_BANK(lp, x) \ do { \ if (SMC_MUST_ALIGN_WRITE(lp)) \ SMC_outl((x)<<16, ioaddr, 12<> 8; \ - __v = SMC_inw(ioaddr, ADDR1_REG(lp)); \ + __v = SMC_in16(ioaddr, ADDR1_REG(lp)); \ addr[2] = __v; addr[3] = __v >> 8; \ - __v = SMC_inw(ioaddr, ADDR2_REG(lp)); \ + __v = SMC_in16(ioaddr, ADDR2_REG(lp)); \ addr[4] = __v; addr[5] = __v >> 8; \ } while (0) #endif #define SMC_SET_MAC_ADDR(lp, addr) \ do { \ - SMC_outw(addr[0]|(addr[1] << 8), ioaddr, ADDR0_REG(lp)); \ - SMC_outw(addr[2]|(addr[3] << 8), ioaddr, ADDR1_REG(lp)); \ - SMC_outw(addr[4]|(addr[5] << 8), ioaddr, ADDR2_REG(lp)); \ + SMC_out16(addr[0]|(addr[1] << 8), ioaddr, ADDR0_REG(lp)); \ + SMC_out16(addr[2]|(addr[3] << 8), ioaddr, ADDR1_REG(lp)); \ + SMC_out16(addr[4]|(addr[5] << 8), ioaddr, ADDR2_REG(lp)); \ } while (0) #define SMC_SET_MCAST(lp, x) \ do { \ const unsigned char *mt = (x); \ - SMC_outw(mt[0] | (mt[1] << 8), ioaddr, MCAST_REG1(lp)); \ - SMC_outw(mt[2] | (mt[3] << 8), ioaddr, MCAST_REG2(lp)); \ - SMC_outw(mt[4] | (mt[5] << 8), ioaddr, MCAST_REG3(lp)); \ - SMC_outw(mt[6] | (mt[7] << 8), ioaddr, MCAST_REG4(lp)); \ + SMC_out16(mt[0] | (mt[1] << 8), ioaddr, MCAST_REG1(lp)); \ + SMC_out16(mt[2] | (mt[3] << 8), ioaddr, MCAST_REG2(lp)); \ + SMC_out16(mt[4] | (mt[5] << 8), ioaddr, MCAST_REG3(lp)); \ + SMC_out16(mt[6] | (mt[7] << 8), ioaddr, MCAST_REG4(lp)); \ } while (0) #define SMC_PUT_PKT_HDR(lp, status, length) \ @@ -1042,8 +1044,8 @@ static const char * chip_ids[ 16 ] = { SMC_outl((status) | (length)<<16, ioaddr, \ DATA_REG(lp)); \ else { \ - SMC_outw(status, ioaddr, DATA_REG(lp)); \ - SMC_outw(length, ioaddr, DATA_REG(lp)); \ + SMC_out16(status, ioaddr, DATA_REG(lp)); \ + SMC_out16(length, ioaddr, DATA_REG(lp)); \ } \ } while (0) @@ -1054,8 +1056,8 @@ static const char * chip_ids[ 16 ] = { (status) = __val & 0xffff; \ (length) = __val >> 16; \ } else { \ - (status) = SMC_inw(ioaddr, DATA_REG(lp)); \ - (length) = SMC_inw(ioaddr, DATA_REG(lp)); \ + (status) = SMC_in16(ioaddr, DATA_REG(lp)); \ + (length) = SMC_in16(ioaddr, DATA_REG(lp)); \ } \ } while (0)