aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/sfc
diff options
context:
space:
mode:
authorBen Hutchings <bhutchings@solarflare.com>2012-02-07 18:39:18 -0500
committerBen Hutchings <bhutchings@solarflare.com>2012-02-15 19:14:59 -0500
commit4ef594eb892b3263fe45d72d5b8161ed4ffa6c0d (patch)
treea32c72e21589039ba99ee5ffaf3999fe78848d82 /drivers/net/ethernet/sfc
parent055e0ad01418bc4d68106df8c8a2d0338fbf67ba (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.c51
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
700static 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
898efx_handle_generated_event(struct efx_channel *channel, efx_qword_t *event) 912efx_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
1133void efx_nic_generate_test_event(struct efx_channel *channel) 1148void 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
1144void efx_nic_generate_fill_event(struct efx_channel *channel) 1153void 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/**************************************************************************