net: tsec: Fix and cleanup tsec_mcast_addr()
There are several implementation issues for tsec_mcast_addr() addressed by this patch: * unmanaged, not portable r/w access to registers; fixed with setbits_be32()/ clrbits_be32() * use of volatile pointers * unnecessary forced cast to u8 for the ether_crc() result * removed redundant parens * corrected some comment slips Signed-off-by: Claudiu Manoil <claudiu.manoil@freescale.com> Patch: 279000
This commit is contained in:
parent
9c4cffacec
commit
876d4515e3
|
@ -113,32 +113,31 @@ static void tsec_configure_serdes(struct tsec_private *priv)
|
||||||
* result.
|
* result.
|
||||||
* 2) Use the 8 most significant bits as a hash into a 256-entry
|
* 2) Use the 8 most significant bits as a hash into a 256-entry
|
||||||
* table. The table is controlled through 8 32-bit registers:
|
* table. The table is controlled through 8 32-bit registers:
|
||||||
* gaddr0-7. gaddr0's MSB is entry 0, and gaddr7's LSB is
|
* gaddr0-7. gaddr0's MSB is entry 0, and gaddr7's LSB is entry
|
||||||
* gaddr7. This means that the 3 most significant bits in the
|
* 255. This means that the 3 most significant bits in the
|
||||||
* hash index which gaddr register to use, and the 5 other bits
|
* hash index which gaddr register to use, and the 5 other bits
|
||||||
* indicate which bit (assuming an IBM numbering scheme, which
|
* indicate which bit (assuming an IBM numbering scheme, which
|
||||||
* for PowerPC (tm) is usually the case) in the tregister holds
|
* for PowerPC (tm) is usually the case) in the register holds
|
||||||
* the entry. */
|
* the entry. */
|
||||||
static int
|
static int
|
||||||
tsec_mcast_addr(struct eth_device *dev, const u8 *mcast_mac, u8 set)
|
tsec_mcast_addr(struct eth_device *dev, const u8 *mcast_mac, u8 set)
|
||||||
{
|
{
|
||||||
struct tsec_private *priv = privlist[1];
|
struct tsec_private *priv = privlist[1];
|
||||||
volatile tsec_t *regs = priv->regs;
|
struct tsec __iomem *regs = priv->regs;
|
||||||
volatile u32 *reg_array, value;
|
u32 result, value;
|
||||||
u8 result, whichbit, whichreg;
|
u8 whichbit, whichreg;
|
||||||
|
|
||||||
result = (u8)((ether_crc(MAC_ADDR_LEN, mcast_mac) >> 24) & 0xff);
|
result = ether_crc(MAC_ADDR_LEN, mcast_mac);
|
||||||
whichbit = result & 0x1f; /* the 5 LSB = which bit to set */
|
whichbit = (result >> 24) & 0x1f; /* the 5 LSB = which bit to set */
|
||||||
whichreg = result >> 5; /* the 3 MSB = which reg to set it in */
|
whichreg = result >> 29; /* the 3 MSB = which reg to set it in */
|
||||||
value = (1 << (31-whichbit));
|
|
||||||
|
|
||||||
reg_array = &(regs->hash.gaddr0);
|
value = 1 << (31-whichbit);
|
||||||
|
|
||||||
|
if (set)
|
||||||
|
setbits_be32(®s->hash.gaddr0 + whichreg, value);
|
||||||
|
else
|
||||||
|
clrbits_be32(®s->hash.gaddr0 + whichreg, value);
|
||||||
|
|
||||||
if (set) {
|
|
||||||
reg_array[whichreg] |= value;
|
|
||||||
} else {
|
|
||||||
reg_array[whichreg] &= ~value;
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif /* Multicast TFTP ? */
|
#endif /* Multicast TFTP ? */
|
||||||
|
|
Loading…
Reference in New Issue