diff options
author | Jack Morgenstein <jackm@dev.mellanox.co.il> | 2012-06-19 04:21:40 -0400 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2012-07-10 12:47:10 -0400 |
commit | 00f5ce99dc6ee46c3113393cc8fa12173f9bbcd7 (patch) | |
tree | cbcd8e2afcd492b3677bf3eedec29b34f249129c /drivers/net/ethernet/mellanox/mlx4/mlx4.h | |
parent | 3045f0920367e625bbec7d66fadb444e673515af (diff) |
mlx4: Use port management change event instead of smp_snoop
The port management change event can replace smp_snoop. If the
capability bit for this event is set in dev-caps, the event is used
(by the driver setting the PORT_MNG_CHG_EVENT bit in the async event
mask in the MAP_EQ fw command). In this case, when the driver passes
incoming SMP PORT_INFO SET mads to the FW, the FW generates port
management change events to signal any changes to the driver.
If the FW generates these events, smp_snoop shouldn't be invoked in
ib_process_mad(), or duplicate events will occur (once from the
FW-generated event, and once from smp_snoop).
In the case where the FW does not generate port management change
events smp_snoop needs to be invoked to create these events. The flow
in smp_snoop has been modified to make use of the same procedures as
in the fw-generated-event event case to generate the port management
events (LID change, Client-rereg, Pkey change, and/or GID change).
Port management change event handling required changing the
mlx4_ib_event and mlx4_dispatch_event prototypes; the "param" argument
(last argument) had to be changed to unsigned long in order to
accomodate passing the EQE pointer.
We also needed to move the definition of struct mlx4_eqe from
net/mlx4.h to file device.h -- to make it available to the IB driver,
to handle port management change events.
Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx4/mlx4.h')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/mlx4.h | 63 |
1 files changed, 2 insertions, 61 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h index e5d20220762c..4d11d12b9db4 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h | |||
@@ -338,66 +338,6 @@ struct mlx4_srq_context { | |||
338 | __be64 db_rec_addr; | 338 | __be64 db_rec_addr; |
339 | }; | 339 | }; |
340 | 340 | ||
341 | struct mlx4_eqe { | ||
342 | u8 reserved1; | ||
343 | u8 type; | ||
344 | u8 reserved2; | ||
345 | u8 subtype; | ||
346 | union { | ||
347 | u32 raw[6]; | ||
348 | struct { | ||
349 | __be32 cqn; | ||
350 | } __packed comp; | ||
351 | struct { | ||
352 | u16 reserved1; | ||
353 | __be16 token; | ||
354 | u32 reserved2; | ||
355 | u8 reserved3[3]; | ||
356 | u8 status; | ||
357 | __be64 out_param; | ||
358 | } __packed cmd; | ||
359 | struct { | ||
360 | __be32 qpn; | ||
361 | } __packed qp; | ||
362 | struct { | ||
363 | __be32 srqn; | ||
364 | } __packed srq; | ||
365 | struct { | ||
366 | __be32 cqn; | ||
367 | u32 reserved1; | ||
368 | u8 reserved2[3]; | ||
369 | u8 syndrome; | ||
370 | } __packed cq_err; | ||
371 | struct { | ||
372 | u32 reserved1[2]; | ||
373 | __be32 port; | ||
374 | } __packed port_change; | ||
375 | struct { | ||
376 | #define COMM_CHANNEL_BIT_ARRAY_SIZE 4 | ||
377 | u32 reserved; | ||
378 | u32 bit_vec[COMM_CHANNEL_BIT_ARRAY_SIZE]; | ||
379 | } __packed comm_channel_arm; | ||
380 | struct { | ||
381 | u8 port; | ||
382 | u8 reserved[3]; | ||
383 | __be64 mac; | ||
384 | } __packed mac_update; | ||
385 | struct { | ||
386 | u8 port; | ||
387 | } __packed sw_event; | ||
388 | struct { | ||
389 | __be32 slave_id; | ||
390 | } __packed flr_event; | ||
391 | struct { | ||
392 | __be16 current_temperature; | ||
393 | __be16 warning_threshold; | ||
394 | } __packed warming; | ||
395 | } event; | ||
396 | u8 slave_id; | ||
397 | u8 reserved3[2]; | ||
398 | u8 owner; | ||
399 | } __packed; | ||
400 | |||
401 | struct mlx4_eq { | 341 | struct mlx4_eq { |
402 | struct mlx4_dev *dev; | 342 | struct mlx4_dev *dev; |
403 | void __iomem *doorbell; | 343 | void __iomem *doorbell; |
@@ -887,7 +827,8 @@ void mlx4_catas_init(void); | |||
887 | int mlx4_restart_one(struct pci_dev *pdev); | 827 | int mlx4_restart_one(struct pci_dev *pdev); |
888 | int mlx4_register_device(struct mlx4_dev *dev); | 828 | int mlx4_register_device(struct mlx4_dev *dev); |
889 | void mlx4_unregister_device(struct mlx4_dev *dev); | 829 | void mlx4_unregister_device(struct mlx4_dev *dev); |
890 | void mlx4_dispatch_event(struct mlx4_dev *dev, enum mlx4_dev_event type, int port); | 830 | void mlx4_dispatch_event(struct mlx4_dev *dev, enum mlx4_dev_event type, |
831 | unsigned long param); | ||
891 | 832 | ||
892 | struct mlx4_dev_cap; | 833 | struct mlx4_dev_cap; |
893 | struct mlx4_init_hca_param; | 834 | struct mlx4_init_hca_param; |