gianfar: Make all BD status writes 32-bit

Whenever we want to update the status field in a BD, we usually want to
update the length field, too.  By combining them into one 32-bit field, we
reduce the number of stores to memory shared with the controller, and we
eliminate the need for order-enforcement, as the length and "READY" bit are
now updated atomically at the same time.

Signed-off-by: Dai Haruki <Dai.Haruki@freescale.com>
Signed-off-by: Andy Fleming <afleming@freescale.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Dai Haruki
2008-12-16 15:34:50 -08:00
committed by David S. Miller
parent 31de198b4d
commit 5a5efed481
2 changed files with 31 additions and 25 deletions

View File

@@ -311,6 +311,8 @@ extern const char gfar_driver_version[];
#define ATTRELI_EI_MASK 0x00003fff
#define ATTRELI_EI(x) (x)
#define BD_LFLAG(flags) ((flags) << 16)
#define BD_LENGTH_MASK 0x00ff
/* TxBD status field bits */
#define TXBD_READY 0x8000
@@ -374,8 +376,13 @@ extern const char gfar_driver_version[];
struct txbd8
{
u16 status; /* Status Fields */
u16 length; /* Buffer length */
union {
struct {
u16 status; /* Status Fields */
u16 length; /* Buffer length */
};
u32 lstatus;
};
u32 bufPtr; /* Buffer Pointer */
};
@@ -390,8 +397,13 @@ struct txfcb {
struct rxbd8
{
u16 status; /* Status Fields */
u16 length; /* Buffer Length */
union {
struct {
u16 status; /* Status Fields */
u16 length; /* Buffer Length */
};
u32 lstatus;
};
u32 bufPtr; /* Buffer Pointer */
};