@@ -204,12 +204,16 @@ struct outbound_phy_packet_event {
204204 struct event event ;
205205 struct client * client ;
206206 struct fw_packet p ;
207- struct fw_cdev_event_phy_packet phy_packet ;
207+ union {
208+ struct fw_cdev_event_phy_packet without_tstamp ;
209+ } phy_packet ;
208210};
209211
210212struct inbound_phy_packet_event {
211213 struct event event ;
212- struct fw_cdev_event_phy_packet phy_packet ;
214+ union {
215+ struct fw_cdev_event_phy_packet without_tstamp ;
216+ } phy_packet ;
213217};
214218
215219#ifdef CONFIG_COMPAT
@@ -1549,26 +1553,41 @@ static void outbound_phy_packet_callback(struct fw_packet *packet,
15491553{
15501554 struct outbound_phy_packet_event * e =
15511555 container_of (packet , struct outbound_phy_packet_event , p );
1552- struct client * e_client ;
1556+ struct client * e_client = e -> client ;
1557+ u32 rcode ;
1558+ struct fw_cdev_event_phy_packet * pp ;
15531559
15541560 switch (status ) {
1555- /* expected: */
1556- case ACK_COMPLETE : e -> phy_packet .rcode = RCODE_COMPLETE ; break ;
1557- /* should never happen with PHY packets: */
1558- case ACK_PENDING : e -> phy_packet .rcode = RCODE_COMPLETE ; break ;
1561+ // expected:
1562+ case ACK_COMPLETE :
1563+ rcode = RCODE_COMPLETE ;
1564+ break ;
1565+ // should never happen with PHY packets:
1566+ case ACK_PENDING :
1567+ rcode = RCODE_COMPLETE ;
1568+ break ;
15591569 case ACK_BUSY_X :
15601570 case ACK_BUSY_A :
1561- case ACK_BUSY_B : e -> phy_packet .rcode = RCODE_BUSY ; break ;
1562- case ACK_DATA_ERROR : e -> phy_packet .rcode = RCODE_DATA_ERROR ; break ;
1563- case ACK_TYPE_ERROR : e -> phy_packet .rcode = RCODE_TYPE_ERROR ; break ;
1564- /* stale generation; cancelled; on certain controllers: no ack */
1565- default : e -> phy_packet .rcode = status ; break ;
1571+ case ACK_BUSY_B :
1572+ rcode = RCODE_BUSY ;
1573+ break ;
1574+ case ACK_DATA_ERROR :
1575+ rcode = RCODE_DATA_ERROR ;
1576+ break ;
1577+ case ACK_TYPE_ERROR :
1578+ rcode = RCODE_TYPE_ERROR ;
1579+ break ;
1580+ // stale generation; cancelled; on certain controllers: no ack
1581+ default :
1582+ rcode = status ;
1583+ break ;
15661584 }
1567- e -> phy_packet .data [0 ] = packet -> timestamp ;
15681585
1569- e_client = e -> client ;
1570- queue_event (e -> client , & e -> event , & e -> phy_packet ,
1571- sizeof (e -> phy_packet ) + e -> phy_packet .length , NULL , 0 );
1586+ pp = & e -> phy_packet .without_tstamp ;
1587+ pp -> rcode = rcode ;
1588+ pp -> data [0 ] = packet -> timestamp ;
1589+ queue_event (e -> client , & e -> event , & e -> phy_packet , sizeof (* pp ) + pp -> length , NULL , 0 );
1590+
15721591 client_put (e_client );
15731592}
15741593
@@ -1577,6 +1596,7 @@ static int ioctl_send_phy_packet(struct client *client, union ioctl_arg *arg)
15771596 struct fw_cdev_send_phy_packet * a = & arg -> send_phy_packet ;
15781597 struct fw_card * card = client -> device -> card ;
15791598 struct outbound_phy_packet_event * e ;
1599+ struct fw_cdev_event_phy_packet * pp ;
15801600
15811601 /* Access policy: Allow this ioctl only on local nodes' device files. */
15821602 if (!client -> device -> is_local )
@@ -1595,10 +1615,12 @@ static int ioctl_send_phy_packet(struct client *client, union ioctl_arg *arg)
15951615 e -> p .header [2 ] = a -> data [1 ];
15961616 e -> p .header_length = 12 ;
15971617 e -> p .callback = outbound_phy_packet_callback ;
1598- e -> phy_packet .closure = a -> closure ;
1599- e -> phy_packet .type = FW_CDEV_EVENT_PHY_PACKET_SENT ;
1618+
1619+ pp = & e -> phy_packet .without_tstamp ;
1620+ pp -> closure = a -> closure ;
1621+ pp -> type = FW_CDEV_EVENT_PHY_PACKET_SENT ;
16001622 if (is_ping_packet (a -> data ))
1601- e -> phy_packet . length = 4 ;
1623+ pp -> length = 4 ;
16021624
16031625 card -> driver -> send_request (card , & e -> p );
16041626
@@ -1633,18 +1655,20 @@ void fw_cdev_handle_phy_packet(struct fw_card *card, struct fw_packet *p)
16331655 spin_lock_irqsave (& card -> lock , flags );
16341656
16351657 list_for_each_entry (client , & card -> phy_receiver_list , phy_receiver_link ) {
1658+ struct fw_cdev_event_phy_packet * pp ;
1659+
16361660 e = kmalloc (sizeof (* e ) + 8 , GFP_ATOMIC );
16371661 if (e == NULL )
16381662 break ;
16391663
1640- e -> phy_packet .closure = client -> phy_receiver_closure ;
1641- e -> phy_packet . type = FW_CDEV_EVENT_PHY_PACKET_RECEIVED ;
1642- e -> phy_packet . rcode = RCODE_COMPLETE ;
1643- e -> phy_packet . length = 8 ;
1644- e -> phy_packet . data [ 0 ] = p -> header [ 1 ] ;
1645- e -> phy_packet . data [1 ] = p -> header [2 ];
1646- queue_event ( client , & e -> event ,
1647- & e -> phy_packet , sizeof ( e -> phy_packet ) + 8 , NULL , 0 );
1664+ pp = & e -> phy_packet .without_tstamp ;
1665+ pp -> closure = client -> phy_receiver_closure ;
1666+ pp -> type = FW_CDEV_EVENT_PHY_PACKET_RECEIVED ;
1667+ pp -> rcode = RCODE_COMPLETE ;
1668+ pp -> length = 8 ;
1669+ pp -> data [0 ] = p -> header [1 ];
1670+ pp -> data [ 1 ] = p -> header [ 2 ];
1671+ queue_event ( client , & e -> event , & e -> phy_packet , sizeof ( * pp ) + 8 , NULL , 0 );
16481672 }
16491673
16501674 spin_unlock_irqrestore (& card -> lock , flags );
0 commit comments