firewire: replace get_features card driver hook
authorStefan Richter <stefanr@s5r6.in-berlin.de>
Sat, 12 Jun 2010 18:30:21 +0000 (20:30 +0200)
committerStefan Richter <stefanr@s5r6.in-berlin.de>
Sat, 19 Jun 2010 11:01:41 +0000 (13:01 +0200)
by feature variables in the fw_card struct.  The hook appeared to be an
unnecessary abstraction in the card driver interface.

Cleaner would be to pass those feature flags as arguments to
fw_card_initialize() or fw_card_add(), but the FairnessControl register
is in the SCLK domain and may therefore not be accessible while Link
Power Status is off, i.e. before the card->driver->enable call from
fw_card_add().

Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
drivers/firewire/core-topology.c
drivers/firewire/core-transaction.c
drivers/firewire/core.h
drivers/firewire/ohci.c
include/linux/firewire.h

index 00a556f3a585c8c83c25d5adf3864c08bd73629e..3b9667c37b67e8e139ad838cf6e2b1b67c2a4bff 100644 (file)
@@ -543,8 +543,7 @@ void fw_core_handle_bus_reset(struct fw_card *card, int node_id, int generation,
 
        spin_lock_irqsave(&card->lock, flags);
 
-       card->broadcast_channel_allocated = (card->driver->get_features(card) &
-                                            FEATURE_CHANNEL_31_ALLOCATED) != 0;
+       card->broadcast_channel_allocated = card->broadcast_channel_auto_allocated;
        card->node_id = node_id;
        /*
         * Update node_id before generation to prevent anybody from using
index 5069cfc75b5032ccdb72a0c82930ba3a9bfecd6d..62bf30560a3e924654c27fbfe4259867b0824da8 100644 (file)
@@ -1129,8 +1129,7 @@ static void handle_registers(struct fw_card *card, struct fw_request *request,
                break;
 
        case CSR_PRIORITY_BUDGET:
-               if (!(card->driver->get_features(card) &
-                                               FEATURE_PRIORITY_BUDGET))
+               if (!card->priority_budget_implemented)
                        rcode = RCODE_ADDRESS_ERROR;
                else if (tcode == TCODE_READ_QUADLET_REQUEST)
                        *data = cpu_to_be32(card->driver->
index 3f9e39b60bca8b04db435c593e8efc9be8a72179..8dc76d8711a59f81c1f67120469b245f5ccfcda2 100644 (file)
@@ -38,9 +38,6 @@ struct fw_packet;
 #define BROADCAST_CHANNEL_INITIAL      (1 << 31 | 31)
 #define BROADCAST_CHANNEL_VALID                (1 << 30)
 
-#define FEATURE_PRIORITY_BUDGET                0x01
-#define FEATURE_CHANNEL_31_ALLOCATED   0x02
-
 #define CSR_STATE_BIT_CMSTR    (1 << 8)
 #define CSR_STATE_BIT_ABDICATE (1 << 10)
 
@@ -84,8 +81,6 @@ struct fw_card_driver {
        u32 (*read_csr_reg)(struct fw_card *card, int csr_offset);
        void (*write_csr_reg)(struct fw_card *card, int csr_offset, u32 value);
 
-       unsigned int (*get_features)(struct fw_card *card);
-
        struct fw_iso_context *
        (*allocate_iso_context)(struct fw_card *card,
                                int type, int channel, size_t header_size);
index 2abdb3268a10d5acfffb3da998ebd637739229cc..09bba9315de9ff428b9942969e1a16f32f8b527c 100644 (file)
@@ -172,7 +172,6 @@ struct fw_ohci {
        int request_generation; /* for timestamping incoming requests */
        unsigned quirks;
        unsigned int pri_req_max;
-       unsigned int features;
        u32 bus_time;
        bool is_root;
 
@@ -1753,15 +1752,14 @@ static int ohci_enable(struct fw_card *card,
        if (version >= OHCI_VERSION_1_1) {
                reg_write(ohci, OHCI1394_InitialChannelsAvailableHi,
                          0xfffffffe);
-               ohci->features |= FEATURE_CHANNEL_31_ALLOCATED;
+               card->broadcast_channel_auto_allocated = true;
        }
 
        /* Get implemented bits of the priority arbitration request counter. */
        reg_write(ohci, OHCI1394_FairnessControl, 0x3f);
        ohci->pri_req_max = reg_read(ohci, OHCI1394_FairnessControl) & 0x3f;
        reg_write(ohci, OHCI1394_FairnessControl, 0);
-       if (ohci->pri_req_max != 0)
-               ohci->features |= FEATURE_PRIORITY_BUDGET;
+       card->priority_budget_implemented = ohci->pri_req_max != 0;
 
        ar_context_run(&ohci->ar_request_ctx);
        ar_context_run(&ohci->ar_response_ctx);
@@ -2132,13 +2130,6 @@ static void ohci_write_csr_reg(struct fw_card *card, int csr_offset, u32 value)
        }
 }
 
-static unsigned int ohci_get_features(struct fw_card *card)
-{
-       struct fw_ohci *ohci = fw_ohci(card);
-
-       return ohci->features;
-}
-
 static void copy_iso_headers(struct iso_context *ctx, void *p)
 {
        int i = ctx->header_length;
@@ -2578,7 +2569,6 @@ static const struct fw_card_driver ohci_driver = {
        .enable_phys_dma        = ohci_enable_phys_dma,
        .read_csr_reg           = ohci_read_csr_reg,
        .write_csr_reg          = ohci_write_csr_reg,
-       .get_features           = ohci_get_features,
 
        .allocate_iso_context   = ohci_allocate_iso_context,
        .free_iso_context       = ohci_free_iso_context,
index 4d22643215ef058cd23b5220c0cbe8090a65f901..5acb5fc191803f3d25040dbc2b87288e777e3ca4 100644 (file)
@@ -122,6 +122,9 @@ struct fw_card {
        bool bm_abdicate; /* value of csr_abdicate before last bus reset */
        bool csr_abdicate; /* visible in CSR STATE_CLEAR/SET registers */
 
+       bool priority_budget_implemented;       /* controller feature */
+       bool broadcast_channel_auto_allocated;  /* controller feature */
+
        bool broadcast_channel_allocated;
        u32 broadcast_channel;
        __be32 topology_map[(CSR_TOPOLOGY_MAP_END - CSR_TOPOLOGY_MAP) / 4];