[Infiniband] Fix event queue doorbell ringing on Arbel
authorMichael Brown <mcb30@etherboot.org>
Tue, 22 Apr 2008 01:15:36 +0000 (02:15 +0100)
committerMichael Brown <mcb30@etherboot.org>
Tue, 22 Apr 2008 01:18:32 +0000 (02:18 +0100)
src/drivers/infiniband/arbel.c
src/drivers/infiniband/arbel.h

index d66ce12..2aced77 100644 (file)
@@ -1410,6 +1410,7 @@ static void arbel_poll_eq ( struct ib_device *ibdev ) {
        struct arbel *arbel = ib_get_drvdata ( ibdev );
        struct arbel_event_queue *arbel_eq = &arbel->eq;
        union arbelprm_event_entry *eqe;
+       union arbelprm_eq_doorbell_register db_reg;
        unsigned int eqe_idx_mask;
        unsigned int event_type;
 
@@ -1445,10 +1446,11 @@ static void arbel_poll_eq ( struct ib_device *ibdev ) {
                arbel_eq->next_idx++;
 
                /* Ring doorbell */
+               MLX_FILL_1 ( &db_reg.ci, 0, ci, arbel_eq->next_idx );
                DBGCP ( arbel, "Ringing doorbell %08lx with %08lx\n",
                        virt_to_phys ( arbel_eq->doorbell ),
-                       arbel_eq->next_idx );
-               writel ( arbel_eq->next_idx, arbel_eq->doorbell );
+                       db_reg.dword[0] );
+               writel ( db_reg.dword[0], arbel_eq->doorbell );
        }
 }
 
index 68be824..7d97b15 100644 (file)
@@ -122,6 +122,10 @@ struct arbelprm_event_mask_st {
        pseudo_bit_t reserved2[0x00016];
 } __attribute__ (( packed ));
 
+struct arbelprm_eq_set_ci_st {
+       pseudo_bit_t ci[0x00020];
+} __attribute__ (( packed ));
+
 struct arbelprm_port_state_change_event_st {
        pseudo_bit_t reserved[0x00020];
        struct arbelprm_port_state_change_st data;
@@ -140,6 +144,7 @@ struct MLX_DECLARE_STRUCT ( arbelprm_cq_arm_db_record );
 struct MLX_DECLARE_STRUCT ( arbelprm_cq_ci_db_record );
 struct MLX_DECLARE_STRUCT ( arbelprm_event_mask );
 struct MLX_DECLARE_STRUCT ( arbelprm_event_queue_entry );
+struct MLX_DECLARE_STRUCT ( arbelprm_eq_set_ci );
 struct MLX_DECLARE_STRUCT ( arbelprm_eqc );
 struct MLX_DECLARE_STRUCT ( arbelprm_hca_command_register );
 struct MLX_DECLARE_STRUCT ( arbelprm_init_hca );
@@ -214,6 +219,11 @@ union arbelprm_doorbell_register {
        uint32_t dword[2];
 } __attribute__ (( packed ));
 
+union arbelprm_eq_doorbell_register {
+       struct arbelprm_eq_set_ci ci;
+       uint32_t dword[1];
+} __attribute__ (( packed ));
+
 union arbelprm_mad {
        struct arbelprm_mad_ifc ifc;
        union ib_mad mad;