}
 
 /**
- * fw_send_request() - submit a request packet for transmission
+ * __fw_send_request() - submit a request packet for transmission to generate callback for response
+ *                      subaction with or without time stamp.
  * @card:              interface to send the request at
  * @t:                 transaction instance to which the request belongs
  * @tcode:             transaction code
  * @offset:            48bit wide offset into destination's address space
  * @payload:           data payload for the request subaction
  * @length:            length of the payload, in bytes
- * @callback:          function to be called when the transaction is completed
+ * @callback:          union of two functions whether to receive time stamp or not for response
+ *                     subaction.
+ * @with_tstamp:       Whether to receive time stamp or not for response subaction.
  * @callback_data:     data to be passed to the transaction completion callback
  *
  * Submit a request packet into the asynchronous request transmission queue.
  * transaction completion and hence execution of @callback may happen even
  * before fw_send_request() returns.
  */
-void fw_send_request(struct fw_card *card, struct fw_transaction *t, int tcode,
-                    int destination_id, int generation, int speed,
-                    unsigned long long offset, void *payload, size_t length,
-                    fw_transaction_callback_t callback, void *callback_data)
+void __fw_send_request(struct fw_card *card, struct fw_transaction *t, int tcode,
+               int destination_id, int generation, int speed, unsigned long long offset,
+               void *payload, size_t length, union fw_transaction_callback callback,
+               bool with_tstamp, void *callback_data)
 {
        unsigned long flags;
        int tlabel;
        tlabel = allocate_tlabel(card);
        if (tlabel < 0) {
                spin_unlock_irqrestore(&card->lock, flags);
-               callback(card, RCODE_SEND_ERROR, NULL, 0, callback_data);
+               if (!with_tstamp) {
+                       callback.without_tstamp(card, RCODE_SEND_ERROR, NULL, 0, callback_data);
+               } else {
+                       // Timestamping on behalf of hardware.
+                       u32 curr_cycle_time = 0;
+                       u32 tstamp;
+
+                       (void)fw_card_read_cycle_time(card, &curr_cycle_time);
+                       tstamp = cycle_time_to_ohci_tstamp(curr_cycle_time);
+
+                       callback.with_tstamp(card, RCODE_SEND_ERROR, tstamp, tstamp, NULL, 0,
+                                            callback_data);
+               }
                return;
        }
 
        t->tlabel = tlabel;
        t->card = card;
        t->is_split_transaction = false;
-       timer_setup(&t->split_timeout_timer,
-                   split_transaction_timeout_callback, 0);
-       t->callback.without_tstamp = callback;
-       t->with_tstamp = false;
+       timer_setup(&t->split_timeout_timer, split_transaction_timeout_callback, 0);
+       t->callback = callback;
+       t->with_tstamp = with_tstamp;
        t->callback_data = callback_data;
 
-       fw_fill_request(&t->packet, tcode, t->tlabel,
-                       destination_id, card->node_id, generation,
+       fw_fill_request(&t->packet, tcode, t->tlabel, destination_id, card->node_id, generation,
                        speed, offset, payload, length);
        t->packet.callback = transmit_complete_callback;
 
 
        card->driver->send_request(card, &t->packet);
 }
-EXPORT_SYMBOL(fw_send_request);
+EXPORT_SYMBOL_GPL(__fw_send_request);
 
 struct transaction_callback_data {
        struct completion done;
 
                      struct fw_request *request, int rcode);
 int fw_get_request_speed(struct fw_request *request);
 u32 fw_request_get_timestamp(const struct fw_request *request);
-void fw_send_request(struct fw_card *card, struct fw_transaction *t,
-                    int tcode, int destination_id, int generation, int speed,
-                    unsigned long long offset, void *payload, size_t length,
-                    fw_transaction_callback_t callback, void *callback_data);
+
+void __fw_send_request(struct fw_card *card, struct fw_transaction *t, int tcode,
+               int destination_id, int generation, int speed, unsigned long long offset,
+               void *payload, size_t length, union fw_transaction_callback callback,
+               bool with_tstamp, void *callback_data);
+
+/**
+ * fw_send_request() - submit a request packet for transmission to generate callback for response
+ *                    subaction without time stamp.
+ * @card:              interface to send the request at
+ * @t:                 transaction instance to which the request belongs
+ * @tcode:             transaction code
+ * @destination_id:    destination node ID, consisting of bus_ID and phy_ID
+ * @generation:                bus generation in which request and response are valid
+ * @speed:             transmission speed
+ * @offset:            48bit wide offset into destination's address space
+ * @payload:           data payload for the request subaction
+ * @length:            length of the payload, in bytes
+ * @callback:          function to be called when the transaction is completed
+ * @callback_data:     data to be passed to the transaction completion callback
+ *
+ * A variation of __fw_send_request() to generate callback for response subaction without time
+ * stamp.
+ */
+static inline void fw_send_request(struct fw_card *card, struct fw_transaction *t, int tcode,
+                                  int destination_id, int generation, int speed,
+                                  unsigned long long offset, void *payload, size_t length,
+                                  fw_transaction_callback_t callback, void *callback_data)
+{
+       union fw_transaction_callback cb = {
+               .without_tstamp = callback,
+       };
+       __fw_send_request(card, t, tcode, destination_id, generation, speed, offset, payload,
+                         length, cb, false, callback_data);
+}
+
+/**
+ * fw_send_request_with_tstamp() - submit a request packet for transmission to generate callback for
+ *                                response with time stamp.
+ * @card:              interface to send the request at
+ * @t:                 transaction instance to which the request belongs
+ * @tcode:             transaction code
+ * @destination_id:    destination node ID, consisting of bus_ID and phy_ID
+ * @generation:                bus generation in which request and response are valid
+ * @speed:             transmission speed
+ * @offset:            48bit wide offset into destination's address space
+ * @payload:           data payload for the request subaction
+ * @length:            length of the payload, in bytes
+ * @callback:          function to be called when the transaction is completed
+ * @callback_data:     data to be passed to the transaction completion callback
+ *
+ * A variation of __fw_send_request() to generate callback for response subaction with time stamp.
+ */
+static inline void fw_send_request_with_tstamp(struct fw_card *card, struct fw_transaction *t,
+       int tcode, int destination_id, int generation, int speed, unsigned long long offset,
+       void *payload, size_t length, fw_transaction_callback_with_tstamp_t callback,
+       void *callback_data)
+{
+       union fw_transaction_callback cb = {
+               .with_tstamp = callback,
+       };
+       __fw_send_request(card, t, tcode, destination_id, generation, speed, offset, payload,
+                         length, cb, true, callback_data);
+}
+
 int fw_cancel_transaction(struct fw_card *card,
                          struct fw_transaction *transaction);
 int fw_run_transaction(struct fw_card *card, int tcode, int destination_id,