Merge branch 'for-linus' of git://www.jni.nu/cris
[sfrench/cifs-2.6.git] / drivers / firewire / core.h
index 0ecfcd95f4c500f62389aa4085c68281b648cc7c..e6239f971be62f425bce4a859dcedb2d05921d8c 100644 (file)
@@ -38,6 +38,9 @@ struct fw_packet;
 #define BROADCAST_CHANNEL_INITIAL      (1 << 31 | 31)
 #define BROADCAST_CHANNEL_VALID                (1 << 30)
 
+#define CSR_STATE_BIT_CMSTR    (1 << 8)
+#define CSR_STATE_BIT_ABDICATE (1 << 10)
+
 struct fw_card_driver {
        /*
         * Enable the given card with the given initial config rom.
@@ -48,6 +51,7 @@ struct fw_card_driver {
        int (*enable)(struct fw_card *card,
                      const __be32 *config_rom, size_t length);
 
+       int (*read_phy_reg)(struct fw_card *card, int address);
        int (*update_phy_reg)(struct fw_card *card, int address,
                              int clear_bits, int set_bits);
 
@@ -75,7 +79,8 @@ struct fw_card_driver {
        int (*enable_phys_dma)(struct fw_card *card,
                               int node_id, int generation);
 
-       u32 (*get_cycle_time)(struct fw_card *card);
+       u32 (*read_csr)(struct fw_card *card, int csr_offset);
+       void (*write_csr)(struct fw_card *card, int csr_offset, u32 value);
 
        struct fw_iso_context *
        (*allocate_iso_context)(struct fw_card *card,
@@ -85,6 +90,8 @@ struct fw_card_driver {
        int (*start_iso)(struct fw_iso_context *ctx,
                         s32 cycle, u32 sync, u32 tags);
 
+       int (*set_iso_channels)(struct fw_iso_context *ctx, u64 *channels);
+
        int (*queue_iso)(struct fw_iso_context *ctx,
                         struct fw_iso_packet *packet,
                         struct fw_iso_buffer *buffer,
@@ -98,8 +105,8 @@ void fw_card_initialize(struct fw_card *card,
 int fw_card_add(struct fw_card *card,
                u32 max_receive, u32 link_speed, u64 guid);
 void fw_core_remove_card(struct fw_card *card);
-int fw_core_initiate_bus_reset(struct fw_card *card, int short_reset);
 int fw_compute_block_crc(__be32 *block);
+void fw_schedule_bus_reset(struct fw_card *card, bool delayed, bool short_reset);
 void fw_schedule_bm_work(struct fw_card *card, unsigned long delay);
 
 static inline struct fw_card *fw_card_get(struct fw_card *card)
@@ -123,6 +130,7 @@ extern const struct file_operations fw_device_ops;
 
 void fw_device_cdev_update(struct fw_device *device);
 void fw_device_cdev_remove(struct fw_device *device);
+void fw_cdev_handle_phy_packet(struct fw_card *card, struct fw_packet *p);
 
 
 /* -device */
@@ -192,7 +200,7 @@ static inline void fw_node_put(struct fw_node *node)
 }
 
 void fw_core_handle_bus_reset(struct fw_card *card, int node_id,
-                             int generation, int self_id_count, u32 *self_ids);
+       int generation, int self_id_count, u32 *self_ids, bool bm_abdicate);
 void fw_destroy_nodes(struct fw_card *card);
 
 /*
@@ -209,6 +217,7 @@ static inline bool is_next_generation(int new_generation, int old_generation)
 
 #define TCODE_IS_READ_REQUEST(tcode)   (((tcode) & ~1) == 4)
 #define TCODE_IS_BLOCK_PACKET(tcode)   (((tcode) &  1) != 0)
+#define TCODE_IS_LINK_INTERNAL(tcode)  ((tcode) == 0xe)
 #define TCODE_IS_REQUEST(tcode)                (((tcode) &  2) == 0)
 #define TCODE_IS_RESPONSE(tcode)       (((tcode) &  2) != 0)
 #define TCODE_HAS_REQUEST_DATA(tcode)  (((tcode) & 12) != 4)
@@ -218,9 +227,18 @@ static inline bool is_next_generation(int new_generation, int old_generation)
 
 void fw_core_handle_request(struct fw_card *card, struct fw_packet *request);
 void fw_core_handle_response(struct fw_card *card, struct fw_packet *packet);
+int fw_get_response_length(struct fw_request *request);
 void fw_fill_response(struct fw_packet *response, u32 *request_header,
                      int rcode, void *payload, size_t length);
+
+#define FW_PHY_CONFIG_NO_NODE_ID       -1
+#define FW_PHY_CONFIG_CURRENT_GAP_COUNT        -1
 void fw_send_phy_config(struct fw_card *card,
                        int node_id, int generation, int gap_count);
 
+static inline bool is_ping_packet(u32 *data)
+{
+       return (data[0] & 0xc0ffffff) == 0 && ~data[0] == data[1];
+}
+
 #endif /* _FIREWIRE_CORE_H */