firewire: implement broadcast_channel CSR for 1394a compliance

See IEEE 1394a clause 8.3.2.3.11.

Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>

+22 -3
+1
drivers/firewire/fw-card.c
··· 403 card->current_tlabel = 0; 404 card->tlabel_mask = 0; 405 card->color = 0; 406 407 INIT_LIST_HEAD(&card->transaction_list); 408 spin_lock_init(&card->lock);
··· 403 card->current_tlabel = 0; 404 card->tlabel_mask = 0; 405 card->color = 0; 406 + card->broadcast_channel = BROADCAST_CHANNEL_INITIAL; 407 408 INIT_LIST_HEAD(&card->transaction_list); 409 spin_lock_init(&card->lock);
+17 -3
drivers/firewire/fw-transaction.c
··· 817 int reg = offset & ~CSR_REGISTER_BASE; 818 unsigned long long bus_time; 819 __be32 *data = payload; 820 821 switch (reg) { 822 case CSR_CYCLE_TIME: 823 case CSR_BUS_TIME: 824 if (!TCODE_IS_READ_REQUEST(tcode) || length != 4) { 825 - fw_send_response(card, request, RCODE_TYPE_ERROR); 826 break; 827 } 828 ··· 832 *data = cpu_to_be32(bus_time); 833 else 834 *data = cpu_to_be32(bus_time >> 25); 835 - fw_send_response(card, request, RCODE_COMPLETE); 836 break; 837 838 case CSR_BUS_MANAGER_ID: ··· 861 862 case CSR_BUSY_TIMEOUT: 863 /* FIXME: Implement this. */ 864 default: 865 - fw_send_response(card, request, RCODE_ADDRESS_ERROR); 866 break; 867 } 868 } 869 870 static struct fw_address_handler registers = {
··· 817 int reg = offset & ~CSR_REGISTER_BASE; 818 unsigned long long bus_time; 819 __be32 *data = payload; 820 + int rcode = RCODE_COMPLETE; 821 822 switch (reg) { 823 case CSR_CYCLE_TIME: 824 case CSR_BUS_TIME: 825 if (!TCODE_IS_READ_REQUEST(tcode) || length != 4) { 826 + rcode = RCODE_TYPE_ERROR; 827 break; 828 } 829 ··· 831 *data = cpu_to_be32(bus_time); 832 else 833 *data = cpu_to_be32(bus_time >> 25); 834 + break; 835 + 836 + case CSR_BROADCAST_CHANNEL: 837 + if (tcode == TCODE_READ_QUADLET_REQUEST) 838 + *data = cpu_to_be32(card->broadcast_channel); 839 + else if (tcode == TCODE_WRITE_QUADLET_REQUEST) 840 + card->broadcast_channel = 841 + (be32_to_cpu(*data) & BROADCAST_CHANNEL_VALID) | 842 + BROADCAST_CHANNEL_INITIAL; 843 + else 844 + rcode = RCODE_TYPE_ERROR; 845 break; 846 847 case CSR_BUS_MANAGER_ID: ··· 850 851 case CSR_BUSY_TIMEOUT: 852 /* FIXME: Implement this. */ 853 + 854 default: 855 + rcode = RCODE_ADDRESS_ERROR; 856 break; 857 } 858 + 859 + fw_send_response(card, request, rcode); 860 } 861 862 static struct fw_address_handler registers = {
+4
drivers/firewire/fw-transaction.h
··· 80 #define CSR_SPEED_MAP 0x2000 81 #define CSR_SPEED_MAP_END 0x3000 82 83 #define fw_notify(s, args...) printk(KERN_NOTICE KBUILD_MODNAME ": " s, ## args) 84 #define fw_error(s, args...) printk(KERN_ERR KBUILD_MODNAME ": " s, ## args) 85 ··· 239 */ 240 int self_id_count; 241 u32 topology_map[252 + 3]; 242 243 spinlock_t lock; /* Take this lock when handling the lists in 244 * this struct. */
··· 80 #define CSR_SPEED_MAP 0x2000 81 #define CSR_SPEED_MAP_END 0x3000 82 83 + #define BROADCAST_CHANNEL_INITIAL (1 << 31 | 31) 84 + #define BROADCAST_CHANNEL_VALID (1 << 30) 85 + 86 #define fw_notify(s, args...) printk(KERN_NOTICE KBUILD_MODNAME ": " s, ## args) 87 #define fw_error(s, args...) printk(KERN_ERR KBUILD_MODNAME ": " s, ## args) 88 ··· 236 */ 237 int self_id_count; 238 u32 topology_map[252 + 3]; 239 + u32 broadcast_channel; 240 241 spinlock_t lock; /* Take this lock when handling the lists in 242 * this struct. */