diff options
author | Ben Hutchings <bhutchings@solarflare.com> | 2012-02-07 18:39:18 -0500 |
---|---|---|
committer | Ben Hutchings <bhutchings@solarflare.com> | 2012-02-15 19:14:59 -0500 |
commit | 4ef594eb892b3263fe45d72d5b8161ed4ffa6c0d (patch) | |
tree | a32c72e21589039ba99ee5ffaf3999fe78848d82 /drivers/net/ethernet/sfc | |
parent | 055e0ad01418bc4d68106df8c8a2d0338fbf67ba (diff) |
sfc: Generalise driver event generation
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Diffstat (limited to 'drivers/net/ethernet/sfc')
-rw-r--r-- | drivers/net/ethernet/sfc/nic.c | 51 |
1 files changed, 27 insertions, 24 deletions
diff --git a/drivers/net/ethernet/sfc/nic.c b/drivers/net/ethernet/sfc/nic.c index dd50c4f73a9d..0a46b1c872a7 100644 --- a/drivers/net/ethernet/sfc/nic.c +++ b/drivers/net/ethernet/sfc/nic.c | |||
@@ -57,13 +57,17 @@ | |||
57 | /* Depth of RX flush request fifo */ | 57 | /* Depth of RX flush request fifo */ |
58 | #define EFX_RX_FLUSH_COUNT 4 | 58 | #define EFX_RX_FLUSH_COUNT 4 |
59 | 59 | ||
60 | /* Generated event code for efx_generate_test_event() */ | 60 | /* Driver generated events */ |
61 | #define EFX_CHANNEL_MAGIC_TEST(_channel) \ | 61 | #define _EFX_CHANNEL_MAGIC_TEST 0x000101 |
62 | (0x00010100 + (_channel)->channel) | 62 | #define _EFX_CHANNEL_MAGIC_FILL 0x000102 |
63 | 63 | ||
64 | /* Generated event code for efx_generate_fill_event() */ | 64 | #define _EFX_CHANNEL_MAGIC(_code, _data) ((_code) << 8 | (_data)) |
65 | #define EFX_CHANNEL_MAGIC_FILL(_channel) \ | 65 | #define _EFX_CHANNEL_MAGIC_CODE(_magic) ((_magic) >> 8) |
66 | (0x00010200 + (_channel)->channel) | 66 | |
67 | #define EFX_CHANNEL_MAGIC_TEST(_channel) \ | ||
68 | _EFX_CHANNEL_MAGIC(_EFX_CHANNEL_MAGIC_TEST, (_channel)->channel) | ||
69 | #define EFX_CHANNEL_MAGIC_FILL(_channel) \ | ||
70 | _EFX_CHANNEL_MAGIC(_EFX_CHANNEL_MAGIC_FILL, (_channel)->channel) | ||
67 | 71 | ||
68 | /************************************************************************** | 72 | /************************************************************************** |
69 | * | 73 | * |
@@ -693,6 +697,16 @@ static void efx_generate_event(struct efx_channel *channel, efx_qword_t *event) | |||
693 | efx_writeo(channel->efx, &drv_ev_reg, FR_AZ_DRV_EV); | 697 | efx_writeo(channel->efx, &drv_ev_reg, FR_AZ_DRV_EV); |
694 | } | 698 | } |
695 | 699 | ||
700 | static void efx_magic_event(struct efx_channel *channel, u32 magic) | ||
701 | { | ||
702 | efx_qword_t event; | ||
703 | |||
704 | EFX_POPULATE_QWORD_2(event, FSF_AZ_EV_CODE, | ||
705 | FSE_AZ_EV_CODE_DRV_GEN_EV, | ||
706 | FSF_AZ_DRV_GEN_EV_MAGIC, magic); | ||
707 | efx_generate_event(channel, &event); | ||
708 | } | ||
709 | |||
696 | /* Handle a transmit completion event | 710 | /* Handle a transmit completion event |
697 | * | 711 | * |
698 | * The NIC batches TX completion events; the message we receive is of | 712 | * The NIC batches TX completion events; the message we receive is of |
@@ -898,12 +912,13 @@ static void | |||
898 | efx_handle_generated_event(struct efx_channel *channel, efx_qword_t *event) | 912 | efx_handle_generated_event(struct efx_channel *channel, efx_qword_t *event) |
899 | { | 913 | { |
900 | struct efx_nic *efx = channel->efx; | 914 | struct efx_nic *efx = channel->efx; |
901 | unsigned code; | 915 | unsigned magic; |
902 | 916 | ||
903 | code = EFX_QWORD_FIELD(*event, FSF_AZ_DRV_GEN_EV_MAGIC); | 917 | magic = EFX_QWORD_FIELD(*event, FSF_AZ_DRV_GEN_EV_MAGIC); |
904 | if (code == EFX_CHANNEL_MAGIC_TEST(channel)) | 918 | |
919 | if (magic == EFX_CHANNEL_MAGIC_TEST(channel)) | ||
905 | ; /* ignore */ | 920 | ; /* ignore */ |
906 | else if (code == EFX_CHANNEL_MAGIC_FILL(channel)) | 921 | else if (magic == EFX_CHANNEL_MAGIC_FILL(channel)) |
907 | /* The queue must be empty, so we won't receive any rx | 922 | /* The queue must be empty, so we won't receive any rx |
908 | * events, so efx_process_channel() won't refill the | 923 | * events, so efx_process_channel() won't refill the |
909 | * queue. Refill it here */ | 924 | * queue. Refill it here */ |
@@ -1132,24 +1147,12 @@ void efx_nic_remove_eventq(struct efx_channel *channel) | |||
1132 | 1147 | ||
1133 | void efx_nic_generate_test_event(struct efx_channel *channel) | 1148 | void efx_nic_generate_test_event(struct efx_channel *channel) |
1134 | { | 1149 | { |
1135 | unsigned int magic = EFX_CHANNEL_MAGIC_TEST(channel); | 1150 | efx_magic_event(channel, EFX_CHANNEL_MAGIC_TEST(channel)); |
1136 | efx_qword_t test_event; | ||
1137 | |||
1138 | EFX_POPULATE_QWORD_2(test_event, FSF_AZ_EV_CODE, | ||
1139 | FSE_AZ_EV_CODE_DRV_GEN_EV, | ||
1140 | FSF_AZ_DRV_GEN_EV_MAGIC, magic); | ||
1141 | efx_generate_event(channel, &test_event); | ||
1142 | } | 1151 | } |
1143 | 1152 | ||
1144 | void efx_nic_generate_fill_event(struct efx_channel *channel) | 1153 | void efx_nic_generate_fill_event(struct efx_channel *channel) |
1145 | { | 1154 | { |
1146 | unsigned int magic = EFX_CHANNEL_MAGIC_FILL(channel); | 1155 | efx_magic_event(channel, EFX_CHANNEL_MAGIC_FILL(channel)); |
1147 | efx_qword_t test_event; | ||
1148 | |||
1149 | EFX_POPULATE_QWORD_2(test_event, FSF_AZ_EV_CODE, | ||
1150 | FSE_AZ_EV_CODE_DRV_GEN_EV, | ||
1151 | FSF_AZ_DRV_GEN_EV_MAGIC, magic); | ||
1152 | efx_generate_event(channel, &test_event); | ||
1153 | } | 1156 | } |
1154 | 1157 | ||
1155 | /************************************************************************** | 1158 | /************************************************************************** |